c++ - 制作。如何生成具有不同库类型的 Visual Studio 解决方案?

标签 c++ visual-studio cmake

C++项目有CMake脚本,内容如下:

#...

if(${CMAKE_BUILD_TYPE} STREQUAL "Debug_static")
    add_library(${PROJECT_NAME} STATIC ${SRC_FILES} ${HEADERS_FILES})
endif()

if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
    add_library(${PROJECT_NAME} SHARED ${SRC_FILES} ${HEADERS_FILES})
endif()

if(${CMAKE_BUILD_TYPE} STREQUAL "Release_static")
    add_library(${PROJECT_NAME} STATIC ${SRC_FILES} ${HEADERS_FILES})
endif()

if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
    add_library(${PROJECT_NAME} SHARED ${SRC_FILES} ${HEADERS_FILES})
endif()

#...

库类型取决于构建类型。当我使用 CMake 构建项目时一切正常,但我无法生成等效的 VS 解决方案。

cmake -G "Visual Studio 15 2017 Win64"

我在没有 CMAKE_BUILD_TYPE 的情况下运行 CMake => 所有 if-s 都是 FALSE => 没有目标 - 没有解决方案。

当我设置CMAKE_BUILD_TYPE

cmake -DCMAKE_BUILD_TYPE=Debug_static -G "Visual Studio 15 2017 Win64"

所有 4 个配置都将类似于 Debug_static。我认为对于这种情况generator-expressions被发明了,但是 add_library 不支持它们的库类型。

所以,我的问题是:如何更改我的 CMake 脚本以使 VS 生成器能够生成等效的解决方案? 4 个配置:2 个共享和 2 个静态。

最佳答案

根据 CMAKE_BUILD_TYPE documentation :

This variable is only meaningful to single-configuration generators...

要为多配置生成器添加自定义配置,您必须设置 CMAKE_CONFIGURATION_TYPES .

set(CMAKE_CONFIGURATION_TYPES Release Debug Release_static Debug_static)

然后为每个新配置类型(Release_static 和 Debug_static)设置项目所需的编译器和链接器变量。

set(CMAKE_CXX_FLAGS_RELEASE_STATIC ${CMAKE_CXX_FLAGS_RELEASE})
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE_STATIC ${CMAKE_SHARED_LINKER_FLAGS_RELEASE})
...
set(CMAKE_CXX_FLAGS_DEBUG_STATIC ${CMAKE_CXX_FLAGS_DEBUG})
...

据我所知,不可能为多配置生成器输出添加单配置目标。因此,只需为共享库和静态库添加单独的目标。

避免为任何配置集构建两个库 EXCLUDE_FROM_DEFAULT_BUILD_CONFIG特性。

add_library(${PROJECT_NAME} SHARED ${SRC_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES
    EXCLUDE_FROM_DEFAULT_BUILD_RELEASE_STATIC TRUE
    EXCLUDE_FROM_DEFAULT_BUILD_DEBUG_STATIC TRUE)

add_library(${PROJECT_NAME}_static STATIC ${SRC_FILES})
set_target_properties(${PROJECT_NAME}_static PROPERTIES
    EXCLUDE_FROM_DEFAULT_BUILD_RELEASE TRUE
    EXCLUDE_FROM_DEFAULT_BUILD_DEBUG TRUE)

构建解决方案将只编译与事件配置匹配的库。

使用OUTPUT_NAME使 ${PROJECT_NAME}_static 目标在输出时生成 ${PROJECT_NAME}.lib。

我希望它足够接近您的场景。

关于c++ - 制作。如何生成具有不同库类型的 Visual Studio 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49422001/

相关文章:

c++ - VC++生成*.dll后*.lib在哪里?

.net - 第 N 次执行一行时中断

c++ - cmake 生成的 makefile 错误中的奇怪字符 "â"

c++ - 部分模板特化 - 成员特化

c++ - 隐藏库中的内部符号

c++ - 什么是数据断点?

c++ - 使用 CMake 创建 Qt qml C++ 插件

c++ - 如何 Qt - Qml 调试和/或分析?

c++ - 如何在C++中使用 "type ... pack-name"参数包?

visual-studio - Visual Studio看不到团队资源管理器