C在另一个子项目中查找包含文件时出现问题



我有一个项目,我们将称之为proj。

它有一个子项目调用config,它不链接到任何内容,因为我们希望将其与主映像分开管理。但是config有一些配置文件,我们称它们为sys_config.h和user_config.h,它们定义了其他人需要访问的结构。为了清楚起见,我希望这些文件与config子项目一起存储。

最后,还有一个库,我们将称之为lib,它包含在proj中。它需要能够引用那些配置包含文件。

因此,文件结构大致如下:

proj
main
src
include
(this references and includes lib below)
config
src
sys_config.c
user_config.c
include
config
sys_config.h
user_config.h
mylib
src
mylib.c
#include <config/sys_config.h>
or
#include <sys_config.h>
include
mylib.h

现在,我在lib的CMakeLists.txt中放了什么,让它能够看到sys_config.h?例如,这不起作用:

target_include_directories(mylib
PUBLIC include
PRIVATE "{$CMAKE_SOURCE_DIR}/config/include"
)

这也不起作用:

target_include_directories(mylib
PUBLIC include
PRIVATE "{$CMAKE_SOURCE_DIR}/config/include/config"
)

这也不是:

target_include_directories(mylib
PUBLIC include
PRIVATE "config/include"
)

我的希望是,如果我回到顶部并包含config/include的完整路径,它可能会找到它,但它没有。我觉得我一定完全误解了target_include_directories((应该如何工作以及它应该为我做什么

收到

使用现代CMake,子项目/子项目的概念是成为一个独立的库/可执行文件。每个子项目(lib.exe(都应该定义一组PUBLIC/PRIVATE头。请参阅-https://cmake.org/cmake/help/latest/command/target_include_directories.html.依赖Rest的项目应该只与子项目库链接。库的包含由CMake内部管理。

基于目录布局的示例cmake文件(我还没有测试过它们,所以只将它们作为参考(。

顶级cmake文件@proj/CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
project(main)
subdirs(config)
subdirs(mylib)
add_executable(hello main/src/main.c)
target_link_libraries(hello config mylib)
install(TARGETS hello DESTINATION bin)

config cmake文件@proj/config/CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
add_library(config src/sys_config.c src/user_config.c)
target_include_directories(config PUBLIC include)
# uncomment if you have any internal headers within config/src
# target_include_directories(config PRIVATE src)

作为最佳实践,请将所有模块config的标头都暴露在config/include/config/。这将使它们在mylib源文件中作为#include "config/sys_config.h"导入。

mylib cmake文件@proj/mylib/CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
add_library(mylib src/mylib.c)
target_include_directories(mylib PUBLIC include)
# uncomment if you have any internal headers in proj/mylib/src
# target_include_directories(mylib PRIVATE src)
target_link_libraries(mylib config)

最新更新