为何已用include_directories添加路径,CMake仍无法识别库?
include_directories还是找不到库? 这是个CMake新手常踩的坑!先给你划个核心重点:include_directories只负责告诉编译器去哪里找头文件,和库文件的识别、链接完全是两码事。结合你的CMakeLists片段,我整理了几个最可能的原因:
混淆了头文件路径和库文件路径
你加了一堆include_directories,只能解决#include <GL/glut.h>这类头文件找不到的问题,但库文件(比如Linux下的.a/.so,Windows下的.lib/.dll)的路径根本没告诉CMake。
解决办法:如果是预编译库,先加link_directories指定库文件所在目录,比如freeglut的库在lib/freeglut/lib的话:link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/freeglut/lib)然后必须在
target_link_libraries里把库绑定到你的目标上:target_link_libraries(你的可执行文件名 PRIVATE freeglut)更推荐的做法是用
find_package(如果库支持的话),比如freeglut可以这么写:find_package(FreeGLUT REQUIRED) include_directories(${FREEGLUT_INCLUDE_DIRS}) target_link_libraries(你的目标名 PRIVATE ${FREEGLUT_LIBRARIES})相对路径的基准搞错了
include_directories里的相对路径是相对于当前CMakeLists.txt所在目录的,你得确认路径是否真的对得上。比如你的项目根目录是project/,CMakeLists在根目录,那lib/freeglut/include是对的,但如果CMakeLists在子目录里,路径就错了。
保险起见,用CMAKE_CURRENT_SOURCE_DIR来拼接绝对路径:include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/freeglut/include)没把库和你的构建目标绑定
就算头文件和库文件的路径都对了,CMake也不会自动把库链接到你的可执行文件上。比如你定义了add_executable(MyApp src/main.cpp),就必须加上target_link_libraries(MyApp PRIVATE freeglut),否则编译的时候会报「未定义引用」的错误(本质就是没链接库)。大小写敏感的坑
如果是在Linux/macOS上,文件系统是大小写敏感的。比如你代码里写#include <gl/glut.h>,但实际路径是lib/freeglut/include/GL/glut.h,这时候头文件就会找不到。要确保代码里的引用和实际路径的大小写完全一致。CMake缓存搞鬼
有时候你改了CMakeLists,但CMake的缓存还保留着旧配置,导致新的路径没生效。解决办法很简单:删除build目录下的CMakeCache.txt,然后重新运行cmake ..(如果你用的是out-of-source构建的话)。库本身没编译好
如果你的freeglut是源码形式,不是预编译库,那光加路径没用,得先把库编译出来。可以用add_subdirectory(lib/freeglut)把库的CMakeLists包含到你的项目里,这样CMake会先编译freeglut,再编译你的项目,之后就能正常链接了。
内容的提问来源于stack exchange,提问作者tribbloid

