如何使用' target_sources'用INTERFACE库命令?

时间:2018-04-24 07:55:08

标签: c++ cmake

我的项目是在子目录(十几个)中组织的,子目录之间有一些包含。其中一些子目录仅包含头文件(例如dir1)。

以下是该项目的组织结构:

project
 |
 |----- src -- dir1  <-- header-only library
 |       |      |--- dir1.h
 |       |      |--- CMakeLists.txt
 |       |
 |       |
 |       | --- dir2
 |       |      |--- dir2.cpp
 |       |      |--- dir2.h
 |       |      |--- CMakeLists.txt
 |       |
 |       | --- file.h
 |       | --- CMakeLists.txt 
 |
 |
 |----- test -- dir1 -- test.cpp
 |       | ---- dir2 -- test.cpp
 |       | ---- includeFile.h
 |
 |
 |----- CMakeLists.txt

我想要一个包含src目录中所有代码的库和一个运行单元测试的可执行文件。在对stackOverFlow和Cmake示例进行一些研究之后,我到达了这些CMake文件。每个src子目录有一个makefile,一个用于对所有库进行分组,一个用于全局。

dir1 CMakeLists

add_library(dir1 INTERFACE)
target_sources(dir1 INTERFACE dir1.h)
target_include_directories(dir1 INTERFACE
  "${PROJECT_SOURCE_DIR}/src/dir1"
)

dir2 CMakeLists

set(dir2_src
  dir2.cpp dir2.h
)

add_library(dir2 ${dir2_src})

src CMakeLists

add_subdirectory(dir1)
add_subdirectory(dir2)


add_library(TheProject INTERFACE)
target_sources(TheProject INTERFACE file.h)
target_include_directories(TheProject INTERFACE
  "${PROJECT_SOURCE_DIR}/src/"
)
target_link_libraries(TheProject INTERFACE dir1
                                dir2
                                ${Boost_LIBRARIES})

主要CMakeLists.txt

project(TheProject)

# gtest
# boost
# compilation flags ...

####### include paths
include_directories("./src/")
include_directories(${Boost_INCLUDE_DIRS})

####### library to compile
add_subdirectory(src)


####### executable
file(GLOB SRCS utest/*/*.cpp)
add_executable(utest ${SRCS} test/includeFile.h)

target_link_libraries(utest gtest_main TheProject)

我几乎在一个较小的项目中使用了相同的组织,没有标题库和INTERFACE,并且它起作用。在这里,我对不同的接口库有错误:

CMake Error at CMakeLists.txt:88 (add_executable):
  Cannot find source file:

    file.h

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

我想我还不太了解INTERFACE的用法。我做了一些研究,但没有解决我的问题。

我还有几个问题:

  • 目录之间存在一些依赖关系(例如,dir1中的代码包含一些dir2文件),我应该在cmake文件中指定这些依赖关系(使用target_link_libraries(dir2 dir1))?
  • 在代码中,include是用src和utest中的相对路径指定的,使用&#34; dir1 / dir1.h&#34;?
  • 这样的路径不是更好吗?

2 个答案:

答案 0 :(得分:2)

传递给target_sources

相对路径相对于add_executable(或add_library)的进一步调用被解释为。< / p>

由于您从顶级目录中呼叫add_executable(),因此CMake会相对于顶级目录搜索test.h,而不是相对于src/目录。

target_sources来电使用绝对路径

target_sources(TheProject INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/file.h)

由于传递给target_sources的CMake 3.13相对路径会立即解析,相对于当前源目录。请参阅@markhc's answer

答案 1 :(得分:1)

作为Tsyvarev对来自Google的任何人的答复的附加组件,target_sources的行为在CMake 3.13上已更改。

您现在可以在target_sources调用中使用相对路径。

https://cmake.org/cmake/help/v3.13/command/target_sources.html

  

相对源文件路径被解释为相对于当前源目录而言