4

私は現在、次のアーキテクチャを持っています

`-- 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.

したがって、スコープの作成をバイパスする解決策を見つけられればいいと思いますが、アーキテクチャのロジックを維持する解決策を採用します。

4

1 に答える 1

6

ここにはいくつかの合理的なオプションがあると思います。

このadd_subdirectoryコマンドは、ライブラリや実行可能ファイルなどのスタンドアロン モジュールを実際に含むディレクトリ (実際にはファイル システムの意味でのサブディレクトリである必要はありません) を含めるためによく使用されます。親 CMakeLists ファイルの助けを借りずに構築できるもの。この場合、サブモジュールの CMakeLists.txt には独自のprojectコマンドが含まれるため、グローバル${PROJECT_NAME}変数の使用が困難になります。

あなたの場合、サブディレクトリの CMakeLists ファイルに、親スコープで定義された変数にファイルのリストを追加するだけのようです。CMAKE_CURRENT_LIST_DIRこれは、下位の CMakeLists でCMake 変数を使用することで実現できます。

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
)

サブディレクトリの CMakeLists ファイルにコマンドがないことを確認してください。project

この場合、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)という事実に単純にかかっています。おそらく最も簡単なオプションは、コマンドを親 CMakeLists.txtに移動することですadd_library${PROJECT_NAME}target_link_librariestarget_link_libraries

于 2012-12-31T21:48:08.693 に答える