c++ - cmake 多个目标 - 一个仅 header 目标和另一个可执行文件

标签 c++ cmake

基于对类似问题 (Cmake include header only target from header only target) 的这个 stackoverflow 回答,我正在创建一个仅 header 库并尝试在可执行文件中使用它。

我的文件夹结构如下:

├── CMakeLists.txt   // root folder CMake file
├── srcs             // this is the hdr only library
│   ├── src1.hpp
│   ├── CMakeLists.txt
│   ├── src2.hpp
│   └── src3.hpp
│   └── ...
└── test             // this is the executable project
    ├── CMakeLists.txt
    └── main.cpp

根级 CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
project (MyProj CXX) 

add_subdirectory(srcs)
add_subdirectory(test)

src 级 CMakeLists.txt(仅用于 header 库)

add_library(MyLib INTERFACE)
target_sources(MyLib  INTERFACE
  "${CMAKE_CURRENT_SOURCE_DIR}/src1.hpp"
  "${CMAKE_CURRENT_SOURCE_DIR}/src2.hpp"
  "${CMAKE_CURRENT_SOURCE_DIR}/src3.hpp"
  )
target_include_directories(MyLib 
  INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
add_subdirectory(plugins)

可执行测试项目的CMake文件

add_executable(MyTest main.cpp)

target_sources(MyTest 
    PRIVATE main.cpp
)

target_include_directories(MyTest PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)

target_link_libraries(MyTest PUBLIC MyLib)

虽然这配置 cmake 没有警告/错误,但运行 make 失败,表明可执行项目无法从库中找到头文件。

/.../nettu2/test/main.cpp:6:10: fatal error: src1.hpp: No such file or directory #include "src1.hpp" ^~~~~~~~~~~~~~~~ compilation terminated. test/CMakeFiles/MyTest.dir/build.make:62: recipe for target 'test/CMakeFiles/MyTest.dir/main.cpp.o' failed make[2]: * [test/CMakeFiles/MyTest.dir/main.cpp.o] Error 1 CMakeFiles/Makefile2:126: recipe for target 'test/CMakeFiles/MyTest.dir/all' failed make[1]: * [test/CMakeFiles/MyTest.dir/all] Error 2 Makefile:129: recipe for target 'all' failed make: *** [all] Error 2

我确定我在这里遗漏了一些关键但微不足道的事情,但仍无法弄清楚这里出了什么问题。我怎样才能让这个构建工作?

最佳答案

你在这一行中有一个小错误:

target_include_directories(MyLib 
  INTERFACE ${CMAKE_CURRENT_BINARY_DIR})

您为 MyLib 指定的 include 目录扩展到与 srcs 相对应的 build 目录,即它会导致像这样的调用

clang++ /path/to/build/test/test.cpp -I /path/to/build/srcs ...

但是您想将实际的 目录传递给预处理器。要解决此问题,请尝试

target_include_directories(MyLib 
   INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

关于c++ - cmake 多个目标 - 一个仅 header 目标和另一个可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55691519/

相关文章:

c++ - 使用 boost::property_tree 枚举从 xml 到 c++ 程序的输入

android - Android Studio 中的无效修订 : 3. 18.1 CMake

c++ - 使用 cmake 交叉编译 libwebsockets

c++ - 为什么这个 'a' = 2,而不是 7?

c++ - 即使委托(delegate)仅添加到 QTableView,QListView 项目也显示委托(delegate)编辑器

c++ - CMake:使静态库有效但动态库无效

c++ - cmake add_dependency、add_custom_command 和 add_custom_target 不能一起工作

qt - CMake + Qt : define the moc/ui output directory

c++ - 为字符串中的每个字符(不是字符位置!)分配唯一索引

c++ - boost asio在基于tcp的协议(protocol)中找到消息的开头