我有没有分成库的项目,但源是在目录树中组织的.我不知道如何告诉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中处理这种编译情况?假设我们有一个包含子目录的源代码目录
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