Ast*_*ter 3 c windows cmake pdcurses undefined-reference
我知道也许这是一个愚蠢的问题,但我看不清楚,我在这里搜索了其他答案,这些答案非常接近我的,但是,我仍然不明白该怎么做.
问题是我无法编译在Windows中使用curses.h的'C'程序(我正在使用Clion和MinGW),当我尝试这样做时,它为curses.h中的函数提供了"未定义的引用" (例如'initscr','clear',......).
通过MinGW安装管理器我安装了"mingw-32-libpdcurses"(有两个可用的两个不同的类:dev和dll;我安装了dll一个).
我正在使用的CMAKE文件是这样的:
cmake_minimum_required(VERSION 3.3)
project(Project1)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -lpdcurses")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
file(GLOB Project1_SRC
"*.h"
"*.c"
)
add_executable(Project1 ${Project1_SRC})
Run Code Online (Sandbox Code Playgroud)
我应该更改它以便使用curses.h进行编译?
基本上与使用CMake 查找和集成任何第三方库的方式相同:使用其中一个打包的Find___.cmake模块.
它们位于share/cmake-X.Y/ModulesCMake安装目录中.检查文件本身的各个文档,以及cmake --help-command find_package有关如何调用它们的详细信息.
我没有在MinGW上专门针对PDCurses尝试以下内容,但是如果它不起作用,那就是向Kitware(CMake的制造商)发送一个明确的错误报告:
find_package( Curses REQUIRED )
include_directories( ${CURSES_INCLUDE_DIRS} )
target_link_libraries( Project1 ${CURSES_LIBRARIES} )
Run Code Online (Sandbox Code Playgroud)
根据需要设置以下变量,以告诉您哪个标头可用:
CURSES_HAVE_CURSES_H 对于 curses.hCURSES_HAVE_NCURSES_H 对于 ncurses.hCURSES_HAVE_NCURSES_NCURSES_H 对于 ncurses/ncurses.hCURSES_HAVE_NCURSES_CURSES_H 对于 ncurses/curses.h其他建议:
file(GLOB Project1_SRC
"*.h"
"*.c"
)
Run Code Online (Sandbox Code Playgroud)
不要那样做.
引用该函数的文档:
我们不建议使用GLOB从源树中收集源文件列表.如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时请求CMake重新生成.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
Run Code Online (Sandbox Code Playgroud)
不要这样做.
您不希望任何生成的文件最终出现在源目录中(它们会妨碍您的版本控制系统,或者更糟糕的是,实际签入存储库).您希望在二进制目录中生成所有内容,干净利落.