2017-04-07 105 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库链接。