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

Posted

技术标签:

【中文标题】制作。如何生成具有不同库类型的 Visual Studio 解决方案?【英文标题】:CMake. How to generate Visual Studo solution with different libary types? 【发布时间】:2018-03-22 06:32:27 【问题描述】:

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 种静态。

【问题讨论】:

【参考方案1】:

根据CMAKE_BUILD_TYPE documentation:

这个变量只对单一配置的生成器有意义...

要为多配置生成器添加自定义配置,您必须设置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。

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

【讨论】:

以上是关于制作。如何生成具有不同库类型的 Visual Studio 解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

在循环中创建多个具有不同名称的对象以存储在数组列表中

解决方案-Visual Studio生成库(DLL&LIB)以及如何调用

如何从Visual Studio中的UML类图生成C#源代码

如何用Visual Studio制作安装包

如何在 Visual-C++ 库 (.net) 中创建重载函数?

如何从具有不同数量和索引顺序的三组字典中制作包含三列的条形图?