私は現在、次のアーキテクチャを持っています
`-- 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.txt
Cannot specify link libraries for target "system" which is not built by this project.
したがって、スコープの作成をバイパスする解決策を見つけられればいいと思いますが、アーキテクチャのロジックを維持する解決策を採用します。