相关疑难解决方法(0)

将Source的子目录添加到cmake项目中

我有没有分成库的项目,但源是在目录树中组织的.我不知道如何告诉cmake进入目录,然后将该目录中的源添加到父目录中定义的项目.我尝试过以下方法:

在project/source/CMakelists.txt中:

set(SOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
  )
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})
Run Code Online (Sandbox Code Playgroud)

然后在project/source/folder1/CMakeLists.txt中:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
)
Run Code Online (Sandbox Code Playgroud)

使用一些message()语句,我发现子文件夹将获取SOURCE变量的内容,但是对该变量的新赋值将不会在返回到父CMakeLists.txt时持续存在

寻找示例并在cmake教程中得出结论: - 源文件结构通常在项目中是平的 - 如果代码被分成文件夹,它通常被分成相应的库.

我想知道是否有一些"最佳实践",我通过尝试这种结构而偏离它.

cmake

49
推荐指数
3
解决办法
6万
查看次数

CMake和子目录取决于父目录

如何在CMake中处理这种编译情况?假设我们有一个包含子目录的源代码目录

src:
 helper:
  innerpkg:
   a.cpp
   a.h
  helper.cpp
  helper.h
 main.cpp
 main.h
Run Code Online (Sandbox Code Playgroud)

文件a.cpp调用文件helper.cpp中的东西,虽然helper.cpp可能不会调用a.cpp中的任何内容.因此,如果我们让helper子目录成为库,而innerpkg成为库,我们就会遇到一个问题,其中helper需要包含innerpkg,但innerpkg也需要帮助 - 一个循环依赖.处理这个问题的正确方法是什么,仍然将一些源文件保留在帮助程序中?顺便说一下,我很擅长使用CMake.

编辑:innerpkg中的CMakeLists.txt文件可能如下所示:

 include_directories(${CCMBS_SOURCE_DIR})
 set(INNERPKG_SRC a.cpp)
 add_library(innerpkg ${INNKERPKG_SRC})
Run Code Online (Sandbox Code Playgroud)

在帮手:

 include_directories(${PROJ_SOURCE_DIR})
 add_subdirectory(innerpkg)
 set(HELPER_SRC helper.cpp)
 add_library(helper ${HELPER_SRC})

 target_link_libraries(ui "-Wl,--whole-archive")
 target_link_libraries(ui innerpkg)
 target_link_libraries(ui "-Wl,--no-whole-archive")
Run Code Online (Sandbox Code Playgroud)

如果这有帮助.如何设置这些来解决这个问题?

编辑:确切的依赖结构是这样的:innerpkg中的东西取决于helper中的东西.innerpkg由main使用.另一种情况是助手也依赖于innerpkg中的东西,即循环依赖,而main则使用helper或innerpkg.

cmake

2
推荐指数
1
解决办法
3094
查看次数

标签 统计

cmake ×2