我有一个带有几个子目录的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
行应该已经解决了。 最佳答案
这不是制作模块的方式-确保可以通过这种方式进行操作,它可以工作,但不是很有用。根据您的布局,只需在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
,所有的魔力就会在幕后发生,您的程序将使用正确的包含目录进行编译,并链接至正确的库。