首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake。如何生成不同类型的可视化学习解决方案?

CMake。如何生成不同类型的可视化学习解决方案?
EN

Stack Overflow用户
提问于 2018-03-22 06:32:27
回答 1查看 724关注 0票数 1

有用于CMake项目的C++脚本,其内容如下:

代码语言:javascript
复制
#...

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解决方案。

代码语言:javascript
复制
cmake -G "Visual Studio 15 2017 Win64"

我运行的CMake没有CMAKE_BUILD_TYPE =>,所有的if-s都是FALSE =>,没有目标-没有解决。

当我设置CMAKE_BUILD_TYPE

代码语言:javascript
复制
cmake -DCMAKE_BUILD_TYPE=Debug_static -G "Visual Studio 15 2017 Win64"

所有4种配置都将类似于Debug_static。我认为在这种情况下,生成器-表达式是被发明出来的,但是add_library并不支持它们的库类型。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-22 16:34:44

根据类型文档的说法:

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

要为多配置生成器添加自定义配置,必须设置类型

代码语言:javascript
复制
set(CMAKE_CONFIGURATION_TYPES Release Debug Release_static Debug_static)

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

代码语言:javascript
复制
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})
...

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

为避免为任何配置集配置属性构建两个库,请执行以下操作。

代码语言:javascript
复制
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)

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

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

我希望这和你的情节足够接近。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49422001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档