gpt4 book ai didi

cmake - 是否可以绕过 add_subdirectory() 命令的新范围创建?

转载 作者:行者123 更新时间:2023-12-04 00:30:44 27 4
gpt4 key购买 nike

我目前有以下架构

`-- system
|-- CMakeLists.txt
|-- dll
| |-- CMakeLists.txt
| |-- UnixDLoader.cpp
| |-- ...
| `-- WinDLoader.hh
|-- sockets
| |-- CMakeLists.txt
| |-- crossplateform_utils.h
| |-- ...
| `-- Udp.hh
`-- threads
|-- CMakeLists.txt
|-- IMutex.hh
|-- ...
`-- WinThread.hh

我的根 CMakeLists.txt如下
project(system)

add_subdirectory(dll)
add_subdirectory(sockets)
add_subdirectory(threads)

add_library(${PROJECT_NAME}
${${PROJECT_NAME}_HEADERS}
${${PROJECT_NAME}_SOURCES}
)

threads/例如,我有以下
list(APPEND ${PROJECT_NAME}_HEADERS
IThread.hh
UnixThread.hh
WinThread.hh
IMutex.hh
UnixMutex.hh
WinMutex.hh
)
set(${PROJECT_NAME}_HEADERS ${${PROJECT_NAME}_HEADERS} PARENT_SCOPE)

list(APPEND ${PROJECT_NAME}_SOURCES
UnixThread.cpp
WinThread.cpp
UnixMutex.cpp
WinMutex.cpp
PARENT_SCOPE
)
set(${PROJECT_NAME}_SOURCES ${${PROJECT_NAME}_SOURCES} PARENT_SCOPE)

if(UNIX)
target_link_libraries(${PROJECT_NAME} pthread)
endif(UNIX)

但是,作为 add_subdirectory()创建一个新范围,我的 ${PROJECT_NAME}_*变量为空。我读到了 set(... PARENT_SCOPE) ,但路径变得无效,无论如何 cmake 在调用 target_link_libraries() 时会产生错误在 system/threads/CMakeLists.txtCannot specify link libraries for target "system" which is not built by this project. .又是范围问题。

因此,如果我找到绕过范围创建的解决方案,我会很好,但我会采用任何能保持我的架构逻辑的解决方案。

最佳答案

我认为你有几个合理的选择。
add_subdirectory命令通常用于包含一个真正包含独立模块的目录(它实际上不必是文件系统意义上的子目录),例如库或可执行文件;一个可以在没有父 CMakeLists 文件帮助的情况下构建的。在这种情况下,子模块的 CMakeLists.txt 将包含它自己的 project命令,渲染使用全局${PROJECT_NAME}变难。

在您的情况下,您似乎只是希望子目录的 CMakeLists 文件将文件列表附加到父范围中定义的变量。您可以通过使用 CMake 变量 CMAKE_CURRENT_LIST_DIR 来实现此目的。在您的下属 CMakeLists 中:

set(${PROJECT_NAME}_HEADERS
${${PROJECT_NAME}_HEADERS}
${CMAKE_CURRENT_LIST_DIR}/IThread.hh
${CMAKE_CURRENT_LIST_DIR}/UnixThread.hh
${CMAKE_CURRENT_LIST_DIR}/WinThread.hh
${CMAKE_CURRENT_LIST_DIR}/IMutex.hh
${CMAKE_CURRENT_LIST_DIR}/UnixMutex.hh
${CMAKE_CURRENT_LIST_DIR}/WinMutex.hh
PARENT_SCOPE
)

set(${PROJECT_NAME}_SOURCES
${${PROJECT_NAME}_SOURCES}
${CMAKE_CURRENT_LIST_DIR}/UnixThread.cpp
${CMAKE_CURRENT_LIST_DIR}/WinThread.cpp
${CMAKE_CURRENT_LIST_DIR}/UnixMutex.cpp
${CMAKE_CURRENT_LIST_DIR}/WinMutex.cpp
PARENT_SCOPE
)

确保您没有 project子目录的 CMakeLists 文件中的命令。

在这种情况下,通过交换 add_subdirectory 可以稍微简单一些。带有 include 的命令命令,从而避免范围问题。

为此,请删除 PARENT_SCOPE来自 set 的参数命令,并在顶级 CMakeLists.txt 中:

   
    add_subdirectory(dll)
    
add_subdirectory(sockets)
add_subdirectory(threads)

include(dll/CMakeLists.txt)
include(sockets/CMakeLists.txt)
include(threads/CMakeLists.txt)

您与 target_link_libraries(${PROJECT_NAME} pthread) 相关的其他问题只是因为 add_library定义库的命令 ${PROJECT_NAME}target_link_libraries 之后调用命令。您最简单的选择可能是移动 target_link_libraries命令到父 CMakeLists.txt

关于cmake - 是否可以绕过 add_subdirectory() 命令的新范围创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14104765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com