使用 ncurses 和 cmake 链接期间未定义的引用

Posted

技术标签:

【中文标题】使用 ncurses 和 cmake 链接期间未定义的引用【英文标题】:Undefined reference during linking using ncurses and cmake 【发布时间】:2016-11-20 23:59:43 【问题描述】:

我正在尝试通过包含以下标头在我的 C++ 程序中使用 ncurses:

#include <curses.h>
#include <menu.h>
#include <stdlib.h>

我正在使用 CLion IDE,这是我的 CMakeList.txt:

cmake_minimum_required(VERSION 3.6)
project(LearnC)

set(CURSES_USE_NCURSES TRUE)
find_package(Curses REQUIRED)
include_directories($CURSES_INCLUDE_DIR)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(LearnC $SOURCE_FILES)
target_link_libraries(LearnC $CURSES_INCLUDE_DIR)

编译顺利,但是在链接时出现以下错误:

[ 20%] Linking CXX executable LearnC
CMakeFiles/LearnC.dir/main.cpp.o: In function `main':
../LearnC/main.cpp:20: undefined reference to `initscr'
../LearnC/main.cpp:22: undefined reference to `clear'
../LearnC/main.cpp:23: undefined reference to `noecho'
../LearnC/main.cpp:24: undefined reference to `curs_set'
../LearnC/main.cpp:25: undefined reference to `cbreak'
../LearnC/main.cpp:26: undefined reference to `nl'
../LearnC/main.cpp:27: undefined reference to `stdscr'
../LearnC/main.cpp:27: undefined reference to `keypad'

我能做些什么来解决这个问题?

【问题讨论】:

【参考方案1】:

从 CMAKE 的文档中,您需要为 target_link_libraries 指定文件而不是目录。所以像

target_link_libraries(LearnC curses)

https://cmake.org/cmake/help/v2.8.12/cmake.html#command%3atarget_link_libraries

【讨论】:

在这种情况下(使用find_package(Curses))库文件列在CURSES_LIBRARIES变量中:target_link_libraries(LearnC $CURSES_LIBRARIES) 这行得通。还将-lncurses 添加到set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11") 也有帮助。 @Tsyvarev 我虽然也是这样,但我实际上已经尝试过了,这就是我收到错误的原因。使用cmake v3.x。这就是我来这个线程的原因,因为我不想手动指定实际的库文件。

以上是关于使用 ncurses 和 cmake 链接期间未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 CMake 和 ncurses 进行编译

CMake 3.9.1:Cmake 找不到库 ncurses

源码安装ncurses-devel

如何在编译期间强制犰狳库链接到本地​​ OpenBLAS

gcov 与 CMake 使用单独的构建目录

使用 cmake 和 Qt4 制作期间的 RCC 解析错误