CMake:C++ 包含相对于基目录

Sam*_*Sam 8 c++ cmake include

假设我有以下文件结构:

project/
  - src/
    - main.cpp
    moduleA/
      - moduleA.cpp
      - moduleA.hpp
    moduleB/
      - moduleB.cpp
      - moduleB.hpp
Run Code Online (Sandbox Code Playgroud)

在 moduleB 中,我想使用 moduleA。因此,我想包括moduleA.hpp但作为src. 又名,我希望能够编写#include moduleA/moduleA.hpp以使用 moduleA。我可以控制所有文件,并且可以放入CMakeLists.txtFindModule<>.cmake放入任何目录。

注意:我想这样做是因为每个模块中都有同名的文件(在本例中为parameters.hpp)。因此,parameters.hpp为了src便于阅读,我希望能够包含相对于目录,并确保包含正确的参数文件。

如果这令人困惑,或者需要任何其他信息,请询问。谢谢各位的帮助!

oLe*_*Len 7

您可以使用类似于以下内容的结构:

project/
  - CMakeLists.txt
  - src/
    - CMakeLists.txt
    - main.cpp
  - moduleA/
      - CMakeLists.txt
      - moduleA/
          - moduleA.cpp
          - moduleA.hpp
  - moduleB/
      - CMakeLists.txt
      - moduleB/
          - moduleB.cpp
          - moduleB.hpp
Run Code Online (Sandbox Code Playgroud)

使用以下文件:


project/CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)

project(myProject)

add_subdirectory(moduleA)
add_subdirectory(moduleB)
add_subdirectory(src)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

project/src/CMakeLists.txt

add_executable(myExe ${exe_sources})
target_link_libraries(myExe A B) # <-- Automatically sets the correct include directories!!
Run Code Online (Sandbox Code Playgroud)

有了这一切,你可以使用

#include "moduleX/moduleX.hpp"
Run Code Online (Sandbox Code Playgroud)

有关类似问题和更详细的答案,请参见此处

  • 您错过了模块间依赖关系。类似于“project/moduleB/CMakeLists.txt”文件中的“target_include_directories(B PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../moduleA)”。 (2认同)