CMake:Include vs add_subdirectory:相对头文件路径

时间:2018-04-23 14:50:58

标签: c++ cmake

我有一个包含多个子目录的c ++项目,例如

src/
  CMakeLists.txt
  main.cpp
  module1/
     CMakeLists.txt
     code.cpp
     code.h
  module2/
     CMakeLists.txt
     code2.cpp

似乎在cmake中处理此问题的两种方法是在add_subdirectory(module1)中使用include(module1)src/CMakeLists.txt。在某处我读到,include使用被视为遗留/弃用。我的src/module1/CMakeLists.txt看起来像这样:

include_directories(${CMAKE_CURRENT_LIST_DIR})

set( SRCS
    ${SRCS}
    ${CMAKE_CURRENT_LIST_DIR}/code.cpp
   )

set( QT_FILE_HEADERS 
    ${QT_FILE_HEADERS} code.h
   )

如果我尝试使用add_subdirectory方法并希望在code.h中使用main.cpp,我必须写#include "module1/code.h"。如果我使用添加module1的include方法,我只需编写#include "code.h"即可。当我在其他地方使用它们时,我宁愿不指定包含文件的相对路径,有没有办法使用add_subdirectory方法实现这一点?我认为include_directories行应该已经处理好了。

1 个答案:

答案 0 :(得分:4)

这不是你应该如何制作模块 - 确保你可以这样做,它有效,但它不是很有用。根据您的布局,只需在主module1/code.cpp文件中引用CMakeLists.txt

但是,如果要使用模块,请将每个模块作为单独的静态库。这将真正简化事情!

src/CMakeLists.txt写:

add_subdirectory(module1)

add_executable(myprogram main.cpp)
target_link_libraries(myprogram module1)

src/module1/CMakeLists.txt写:

add_library(module1 STATIC code.cpp)
target_include_directories(module1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

这样,您只从module1 CMake脚本传回一件事:module1目标。您的main并不需要了解其中发生的事情。如果module1中的代码需要特定的外部库,请将其链接到那里,主CMake脚本不需要了解它。只需链接到module1,所有魔法都将在幕后发生,您的程序将使用正确的包含目录进行编译并链接到正确的库。