我有一个带有几个子目录的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,所有的魔力就会在幕后发生,您的程序将使用正确的包含目录进行编译,并链接至正确的库。

10-08 10:47