cmake多重目标-仅一个标头目标,另一个为可执行文件

时间:2019-04-15 14:34:05

标签: c++ cmake

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

我的文件夹结构如下:

├── 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(仅用于标头库)

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:致命错误:src1.hpp:否这样   文件或目录#include“ src1.hpp”             ^ ~~~~~~~~~~~~~~~编译终止。 test / CMakeFiles / MyTest.dir / build.make:62:目标配方   “ test / CMakeFiles / MyTest.dir / main.cpp.o”失败make [2]: *   [test / CMakeFiles / MyTest.dir / main.cpp.o]错误1   CMakeFiles / Makefile2:126:目标配方   'test / CMakeFiles / MyTest.dir / all'失败make [1]:*   [test / CMakeFiles / MyTest.dir / all]错误2 Makefile:129:配方   目标“全部”失败:*** [全部]错误2

我确定我在这里遗漏了一些关键但琐碎的事情,但是却无法弄清这里出了什么问题。我该如何使该版本正常工作?

1 个答案:

答案 0 :(得分:1)

您在此行中有一个小错误:

?

您为target_include_directories(MyLib INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) 指定的包含目录会扩展到与MyLib对应的 build 目录,即它会导致类似

的调用
srcs

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

clang++ /path/to/build/test/test.cpp -I /path/to/build/srcs ...
相关问题