我的项目被组织在子目录中(十几个),子目录之间有一些包含。其中一些子目录只包含头文件(例如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})
源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)
我几乎在一个较小的项目中使用了相同的组织,没有头,只有库和接口,并且它起作用了。在这里,我有一个关于不同接口库的错误:
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
我想我还没有很好地理解接口的用法。我做了一些研究,但没有解决我的问题。
我还有几个问题:
这样的路径不是更好吗
发布于 2018-04-24 17:14:49
在CMake 3.13之前,传递给target_sources
的相对路径被解释为相对于add_executable
(或add_library
)的进一步调用。
因为从顶层目录调用add_executable()
,所以CMake相对于顶层目录搜索test.h
,而不是相对于src/
目录。
对target_sources
调用使用绝对路径:
target_sources(TheProject INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/file.h)
由于CMake 3.13中传递给target_sources
的相对路径是相对于当前源目录的,因此会立即解析。参见@markhc's answer。
https://stackoverflow.com/questions/49996260
复制相似问题