说我有以下文件结构:
project/
- src/
- main.cpp
moduleA/
- moduleA.cpp
- moduleA.hpp
moduleB/
- moduleB.cpp
- moduleB.hpp
在moduleB中,我想使用moduleA。因此,我想包含
moduleA.hpp
,但作为src
的相对路径。 aka,我希望能够编写#include moduleA/moduleA.hpp
以使用moduleA。我可以控制所有文件,可以将CMakeLists.txt
或FindModule<>.cmake
放在任何目录中。注意:我想这样做是因为每个模块中都有文件具有相同的名称(在本例中为
parameters.hpp
)。因此,出于可读性的考虑,我希望能够包含相对于parameters.hpp
目录的src
,并确保包含正确的参数文件。如果这令人困惑,或者需要任何其他信息,请询问。谢谢各位的帮助!
最佳答案
您可以使用类似于以下内容的结构:
project/
- CMakeLists.txt
- src/
- CMakeLists.txt
- main.cpp
- moduleA/
- CMakeLists.txt
- moduleA/
- moduleA.cpp
- moduleA.hpp
- moduleB/
- CMakeLists.txt
- moduleB/
- moduleB.cpp
- moduleB.hpp
带有以下文件:
project/CMakeLists.txt
:cmake_minimum_required(VERSION 3.0.2)
project(myProject)
add_subdirectory(moduleA)
add_subdirectory(moduleB)
add_subdirectory(src)
project/moduleX/CMakeLists.txt
(X = A或B):add_library(X STATIC ${moduleX_sources})
# The following line is very practical:
# it will allow you to automatically add the correct include directories with "target_link_libraries"
target_include_directories(X PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
# only in CMakeLists.txt of module B, possibly with PRIVATE instead of PUBLIC
target_link_libraries(X PUBLIC A)
project/src/CMakeLists.txt
:add_executable(myExe ${exe_sources})
target_link_libraries(myExe A B) # <-- Automatically sets the correct include directories!!
有了这些,您可以使用
#include "moduleX/moduleX.hpp"
有关类似问题和更详细的答案,请参见here。