为什么CMake无法识别库,尽管它是由"include_directories"添加的?



我的CMakeList文件定义了应包含在构建路径中的目录列表:

set(CMAKE_CXX_STANDARD 11)
include_directories(lib)
include_directories(lib/freeglut)
include_directories(lib/freeglut/include)
include_directories(lib/freeglut/include/GL)
include_directories(lib/matrix)
include_directories(lib/mavlink)
include_directories(lib/mavlink/common)
include_directories(src)
include_directories(src/Drawing)
include_directories(src/Math)
include_directories(src/MavlinkNode)
include_directories(src/Simulation)
include_directories(src/Utility)
...

所有依赖文件都在/lib 下。当我运行CMake CMakeList.txt & make时,我收到以下错误:

[100%] Linking CXX executable FCND_Controls_CPP
CMakeFiles/FCND_Controls_CPP.dir/src/main.cpp.o: In function `main':
/home/peng/git-drone/__Udacity__/FCND-Controls-CPP/src/main.cpp:68: undefined reference to `glutTimerFunc'
/home/peng/git-drone/__Udacity__/FCND-Controls-CPP/src/main.cpp:70: undefined reference to `glutMainLoop'
...

虽然两个函数glutTimerFunc和glutMainLoop都在'lib/freeglut/include/GL/freeglut.h'下。然而,无论是CMake还是make都忽略了它们。为什么会发生这种情况,我应该怎么做才能解决它们?

我使用的是 cmake 3.9.1,我尝试了 2 个后端:gcc/g++ 和 clang/clang++,两者都给出了相同的错误。

您正在使用include_directories编译器检查包含的目录。你应该使用的是 target_link_libraries .

但是,由于您使用的是已知库,因此您需要执行以下操作(您可以在cmake-modules目录下的FindGLUT.cmake文件中找到此信息(:

find_package(GLUT REQUIRED)
target_include_directories(your_exe PUBLIC ${GLUT_INCLUDE_DIR}) # could also be PRIVATE, depending on usage
target_link_libraries(your_exe ${GLUT_LIBRARY} )

请注意,您还需要对具有缓存变量 ${OPENGL_INCLUDE_DIR}${OPENGL_LIBRARIES}OpenGL库执行相同的操作。

注意:尽量避免使用include_directories(不带目标(,因为这被认为是样式,并且具有污染所有目标的包含目录的缺点。

最新更新