我的项目是在子目录(十几个)中组织的,子目录之间有一些包含。其中一些子目录仅包含头文件(例如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的用法。我做了一些研究,但没有解决我的问题。
我还有几个问题:
答案 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
相对源文件路径被解释为相对于当前源目录而言