2017-04-07 73 views
0

我知道類似的問題已張貼,但我看不出他們如何與我的情況。我將通過說我對CMake不是很熟悉來解釋這個問題,所以完全有可能這是一個快速修復,我只是看不到它!不能與CMake的編譯和NCURSES

我合作的一個項目,昨天我的隊友加入ncurses庫的項目,以建立一個終端GUI。自從添加了ncurses之後,我一直無法編譯我的項目。但是,我確實安裝了所有6個ncurses- *包,因此它應該適用於我的機器。

我從我們的GitHub庫,它編譯和運行完全在他的機器上拆了最新版本的主分支。但它甚至不會在我的編譯。

系統:
Linux Mint的18.1肉桂
的CMake版本3.5.1

事情我已經嘗試:
我刪除CMakeCache.txt並重新加載它
我刪除了我整個的CMake建立目錄和redid製作

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 

有趣的是,如果我複製/粘貼irc_client_gui.c別人在我的機器上的某個地方,手工用gcc編譯並運行它,它完美的作品。所以這個問題不是我的機器,它是CMake試圖編譯我的整個項目的東西。有任何想法嗎?非常感謝!

+1

'所以,問題不在於我的機器,它的東西與CMake的嘗試編譯我的整個project.' - 在項目的'CMakeLists.txt'文件中的問題,但你沒有表現出來。 – Tsyvarev

+0

@Tsyvarev oops,我只是把它添加到頂部。謝謝! –

+1

如何運行'使VERBOSE = Y'這樣你就可以清楚地看到,編譯器/連接器是如何調用?我強烈懷疑'-lncurses'沒有在鏈接器步驟中傳遞,因爲您沒有使用類似'target_link_libraries'的東西。未定義的引用錯誤通常是由鏈接期間缺少'-l'參數引起的。 –

回答

1

的解決方案是增加這樣一行:

target_link_libraries(client ncurses) 

這告訴CMake的,當它被鏈接client目標,它應該使用-lncurses選項ncurses庫鏈接。