我正在尝试建立一个项目,在该项目中,子文件夹库 src 代码以及使用 Cmake 的顶级中的 src 代码都可以找到头文件。目前我收到一个错误,指出无法找到头文件。我的项目结构如下所示:
root/
src/
CMakeLists.txt #(top level)
main.c
lib/
lib1.c
CMakeLists.txt #(lower level)
headers/
lib1.h
build/
我的顶级 CMakeLists.txt 如下所示:
cmake_minimum_required(VERSION 3.13.4)
project(CmakeTUT_Proj)
add_executable(${PROJECT_NAME} main.c)
target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/)
add_subdirectory(Lib/)
target_link_directories(${PROJECT_NAME} PRIVATE Lib/headers/)
target_link_libraries(${PROJECT_NAME} name_of_lib)
我的低级 CMakeLists.txt 看起来像:
add_library(name_of_lib adder.c)
我的 main.c 和 lib1.c 程序将库包含为 #include "lib1.h"
,cmake 运行良好,没有任何错误,但是当我使用 make
构建项目时,出现如下错误:
root/src/Lib/lib1.c:2:10: fatal error: lib1.h: No such file or directory
#include "lib1.h"
我想构建我的项目,以便 main.c 和 lib1.c 可以访问 lib1.h。有任何想法吗?谢谢。
答案 0 :(得分:2)
顾名思义,target_include_directories
只影响一个目标。因此,当您设置 target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/)
时,这会添加到名为 ${PROJECT_NAME}
的可执行目标的包含路径中,但不会添加到库 name_of_lib
的包含路径中。
要解决此问题,您可以在较低级别 CMakeLists.txt
中添加库的包含路径:
target_include_directories(name_of_lib PUBLIC headers)
作为奖励,因为它是 PUBLIC
,所以此路径也会自动添加到任何依赖于 name_of_lib
的目标。因此,在顶级 CMakeLists.txt
中,您可以删除此行:
target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/)
另外,这行看起来没用,也可以删除:
target_link_directories(${PROJECT_NAME} PRIVATE Lib/headers/)
链接库通常不放在头目录中。