【问题标题】:CMake Shared Library: how to specify different output directories for DLL and LIB files?CMake 共享库:如何为 DLL 和 LIB 文件指定不同的输出目录?
【发布时间】:2018-10-31 06:38:03
【问题描述】:

背景

鉴于我正在使用 CMake 创建一个共享库:

add_library(SharedLib SHARED sharedlib.cpp shared_exports.h)
target_include_directories(SharedLib PUBLIC ${PROJECT_SOURCE_DIR}/src/libshared)
include(GenerateExportHeader)
GENERATE_EXPORT_HEADER(SharedLib
    EXPORT_MACRO_NAME SHARED_EXPORTS
    EXPORT_FILE_NAME ${PROJECT_SOURCE_DIR}/src/libshared/shared_exports.h)

它创建了 5 个文件:

SharedLib.dll SharedLib.exp SharedLib.ilk SharedLib.lib SharedLib.pdb

这很棒。所有输出文件都转到我在全局 CMakeLists.txt 中指定的目录。

问题

但我想单独指定 DLL 及其对应的 PDB 文件进入我的主构建目录的其他地方。 (将 .lib 文件留在原处)

我尝试了很多组合:

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)

使用不同的变量让我头晕目眩。 我该怎么做?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    不同构建工件的输出目录由不同的 CMake 变量(和相应的属性)调节:

    例子:

    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pdb)
    
    add_library(SharedLib SHARED sharedlib.cpp shared_exports.h)
    

    【讨论】:

    • 这些设置命令必须在调用add_library之前还是之后出现?看起来必须先设置它才能工作。
    • 请注意,这几乎对我有用。我在顶级 CMakeLists.txt 文件中修改了 CMAKE_BINARY_DIR 。因此,我发现 CMAKE_BINARY_DIR 的变化取决于调用哪个 CMakeLists.txt 文件。所以我不得不使用这个:
    • 不,永远不要设置CMAKE_BINARY_DIR 变量:CMake 假定它指向顶级构建目录,如果不是真的,某些功能可能会突然中断。
    • 好的,谢谢你的建议,我会考虑改变的。
    【解决方案2】:

    我发现这是可行的:

    # Top level CMakeLists.txt file:
    
    set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)
    set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
    set(LIBRARY_OUTPUT_PATH    ${CMAKE_BINARY_DIR}/lib)
    

    在我的 src/libShared/CMakeLists.txt 文件中,我必须在调用 add_library 之前放置 set 命令

    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
    add_library(SharedLib SHARED sharedlib.cpp shared_exports.h)
    

    否则,我发现很难,我可以像这样在调用add_library 之后设置属性:

    set_target_properties(SharedLib PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}
    )
    

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多