2017-04-07 5 views
0

Ich bin mir bewusst, ähnliche Fragen geschrieben wurden, aber ich kann nicht sehen, wie sie auf meinen Fall beziehen. Ich werde diese Frage vorbringen, indem ich sage, dass ich mit CMake nicht sehr vertraut bin, also ist es durchaus möglich, dass dies eine schnelle Lösung ist und ich es einfach nicht sehe!Kann nicht mit CMake kompilieren und ncurses

ich an einem Projekt bin zusammen, und gestern hinzugefügt mein Teamkollege die ncurses-Bibliothek in das Projekt einen Terminal GUI zu bauen. Seit dem Hinzufügen von Ncurses konnte ich mein Projekt nicht kompilieren. Allerdings habe ich alle 6 ncurses- * Pakete installiert, so sollte es sich mit meinem Rechner verhalten.

Ich habe die neueste Version des Master-Zweig von unserem GitHub Repo, die perfekt nach unten gezogen und läuft auf seiner Maschine kompiliert. Aber es wird nicht einmal auf meinem kompilieren.

System:
Linux Mint 18,1 Cinnamon
CMake Version 3.5.1

Dinge, die ich versucht habe:
ich CMakeCache.txt gelöscht und neu geladen es
ich meine ganze CMake gelöscht Build-Verzeichnis und redid machen

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 
project(irc) 

set(SHARED_FLAGS " -Wall -Wextra -Wshadow -Werror -g -D_POSIX_C_SOURCE=200809L -lncurses") 
set(CMAKE_C_FLAGS "-std=c11 ${SHARED_FLAGS}") 
set(CMAKE_CXX_FLAGS "-std=c++11 ${SHARED_FLAGS}") 

include_directories(include) 

add_library(client_core SHARED src/client/irc_client.c) 

add_executable(client src/client/irc_client_gui.c) 
add_executable(server src/server/irc_server.c) 

// SOLUTION - MISSING LINE 
target_link_libraries(client ncurses) 

install(FILES include/irc_client.h DESTINATION include) 
install(FILES include/irc_server.h DESTINATION include) 

CMakeOutput:

CMakeFiles/client.dir/src/client/irc_client_gui.c.o: In function `main': 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:17: 
undefined reference to `initscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:19: 
undefined reference to `mvprintw' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:21: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:21: 
undefined reference to `wgetnstr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:22: 
undefined reference to `LINES' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:22: 
undefined reference to `mvprintw' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:23: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:23: 
undefined reference to `wgetch' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:24: 
undefined reference to `endwin' 
collect2: error: ld returned 1 exit status 
CMakeFiles/client.dir/build.make:94: recipe for target 'client' failed 
make[2]: *** [client] Error 1 
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/client.dir/all' 
failed 
make[1]: *** [CMakeFiles/client.dir/all] Error 2 
Makefile:127: recipe for target 'all' failed 
make: *** [all] Error 2 

Interessanterweise, wenn ich Kopieren/Einfügen irc_client_gui.c woanders auf meiner Maschine, kompilieren Sie es manuell mit gcc und führen Sie es, es funktioniert perfekt. Das Problem ist also nicht meine Maschine, es ist etwas mit CMake, das versucht, mein gesamtes Projekt zu kompilieren. Irgendwelche Ideen? Vielen Dank!

+1

'Also das Problem ist nicht meine Maschine, es ist etwas mit CMake versucht, mein ganzes Projekt zu kompilieren. - Das Problem mit der' CMakeLists.txt' Datei Ihres Projekts, aber Sie zeigen es nicht. – Tsyvarev

+0

@Tsyvarev oops, ich habe es nur oben hinzugefügt. Vielen Dank! –

+1

Wie wäre es mit 'make VERBOSE = Y', damit Sie genau sehen können, wie der Compiler/Linker aufgerufen wurde? Ich vermute stark, dass das '-lncurses' im Linker-Schritt nicht übergeben wird, weil Sie so etwas wie' target_link_libraries' nicht verwendet haben. Nicht definierte Referenzfehler werden sehr oft durch ein fehlendes '-l' Argument während der Verknüpfung verursacht. –

Antwort

1

Die Lösung ist eine Zeile wie diese hinzu:

target_link_libraries(client ncurses) 

Dies sagt CMake, dass, wenn es das client Ziel ist die Verknüpfung, sollte es die -lncurses Option in der ncurses-Bibliothek zu verknüpfen.

Verwandte Themen