Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么CMake无法识别由';包括目录';?_C++_Cmake_Dependency Management - Fatal编程技术网

C++ 为什么CMake无法识别由';包括目录';?

C++ 为什么CMake无法识别由';包括目录';?,c++,cmake,dependency-management,C++,Cmake,Dependency Management,My 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_dir

My 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下。运行
cmakecmakelist.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,我尝试了两个后端:gcc/g++和clang/clang++,但都给出了相同的错误。

您使用的是
include\u目录
,它们是编译器检查包含的目录。您应该使用的是
目标链接库

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

注意,您还需要对带有缓存变量的
OpenGL
${OpenGL\u INCLUDE\u DIR}
${OpenGL\u库}
执行相同的操作

注意:尽量避免使用
include_目录
(无目标),因为这被认为是较旧的样式,并且有污染所有目标的include目录的缺点


@Tsyvarev的可能重复项这不是重复项。@Samaursa:为什么不重复?问题的作者得到了“未定义的参考”,他不知道这是什么意思。他希望在头文件中定义函数,而不注意“链接”这个词。重复的问题解释了“未定义的引用”的含义,并得到了如何处理的提示。@Tsyvarev True,OP似乎不知道未定义的引用是什么意思,但是由于他使用的是
CMake
,他们无法完全遵循另一个问题的解决方案。另一个问题/解决方案是OP的一个很好的参考。看起来不是这样:在我将前几个include_目录更改为target_link_库之后,我遇到了以下错误:CMakeLists.txt:6(target_link_库)上的CMake错误:无法为target“lib”指定链接库它不是由此项目生成的。您不能将
包含目录
替换为
目标链接库
。您可以将
包含目录
替换为
目标包含目录
,在这种情况下,您还必须使用
公共
(我忘了将其放在解决方案中,请参见编辑我的答案)。
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} )