我正在尝试建立一个项目,在该项目中,子文件夹库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程序包含库as #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。有任何想法吗?谢谢。
顾名思义,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/)
链接库通常不放置在标头目录中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句