我有一个包含多个子目录的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
行应该已经处理好了。
答案 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
,所有魔法都将在幕后发生,您的程序将使用正确的包含目录进行编译并链接到正确的库。