c - CMake 和子文件夹中的头文件问题
问题描述
我正在尝试建立一个项目,其中子文件夹库 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/)
链接库通常不放在 headers 目录中。
推荐阅读
- jquery - 在 IBM MobileFirst Platform 上获取位置时出错
- lisp - Lisp 中用于 minimax-alpha-beta 的 REVERSE 函数
- css - 跨项目共享css和ts
- uwp - UWP XAML Prism 未正确绑定数据
- javascript - 向 Bootstrap 4 导航栏下拉菜单添加幻灯片效果(在菜单外部关闭)的问题
- jquery - asp.net核心中的xml绑定
- javascript - 如果最小化,Cordova Windows 应用程序脚本不会执行
- html - 不从Angular 7中的本地路径加载图像
- c - Prime 与否 Prime 输出缓慢
- kubernetes - Kubernetes:了解资源请求/限制和调度