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个静态。
答案 0 :(得分: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。
我希望它与你的情景足够接近。