我希望使用cmake ExternalProject在窗口上将xerces-c构建为静态库。但是,要使其工作,我需要将XERCES_STATIC_LIBRARY预处理器定义添加到项目中。在linux上,我似乎可以很容易地用一个补丁文件来完成这个任务,但是我不知道如何在windows上这样做。
以下是我目前的CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
PROJECT(xercesc)
SET(TARGET_NAME xercesc)
IF(WIN32)
# find the msvc version
if(${MSVC_VERSION} EQUAL 1400)
SET(VC_PROJ_DIR VC8)
elseif(${MSVC_VERSION} EQUAL 1500)
SET(VC_PROJ_DIR VC9)
elseif(${MSVC_VERSION} EQUAL 1600)
SET(VC_PROJ_DIR VC10)
elseif(${MSVC_VERSION} EQUAL 1700)
SET(VC_PROJ_DIR VC11)
elseif(${MSVC_VERSION} EQUAL 1800)
SET(VC_PROJ_DIR VC12)
endif(${MSVC_VERSION} EQUAL 1400)
include(ExternalProject)
ExternalProject_Add(
${TARGET_NAME}
URL ${CMAKE_CURRENT_SOURCE_DIR}/xerces-c-${XERCESC_VERSION}.tar.gz
DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
CONFIGURE_COMMAND ""
BUILD_COMMAND Devenv "${CMAKE_CURRENT_SOURCE_DIR}/xercesc/projects/Win32/${VC_PROJ_DIR}/xerces-all/xerces-all.sln" /build Release
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1
)
ENDIF(WIN32)
发布于 2015-10-01 11:56:14
从Devenv
切换到msbuild
命令行的秘密沙司.它更强大,您可以使用/property:DefineConstants=XERCES_STATIC_LIBRARY
定义常量。小心:它会吹走项目文件中定义的其他常量.但是,您不会傻到在cmake构建中的.vcxproj文件中定义常量,对吗?
总之,这里是在windows上构建xerces-c的完整解决方案。注意,对于静态构建,它们在配置名称中使用(上帝被遗忘的)空间。最简单的解决办法是用下划线代替它们,然后继续生活。我用的是查找和替换文本(屁)工具。
另外,我正在构建DLL运行库,所以我替换了所有的/MT选项。
cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
PROJECT(xercesc)
SET(TARGET_NAME xercesc)
IF(WIN32)
# find the msvc version
if(${MSVC_VERSION} EQUAL 1400)
SET(VC_PROJ_DIR VC8)
elseif(${MSVC_VERSION} EQUAL 1500)
SET(VC_PROJ_DIR VC9)
elseif(${MSVC_VERSION} EQUAL 1600)
SET(VC_PROJ_DIR VC10)
elseif(${MSVC_VERSION} EQUAL 1700)
SET(VC_PROJ_DIR VC11)
elseif(${MSVC_VERSION} EQUAL 1800)
SET(VC_PROJ_DIR VC12)
endif(${MSVC_VERSION} EQUAL 1400)
# Use FART to replace spaces in the project files, ugh. FART requires windows style slashes.
SET(XERCES_SOLUTION_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/projects/Win32/${VC_PROJ_DIR}/xerces-all)
SET(XERCES_SOLUTION "${XERCES_SOLUTION_DIR}/xerces-all.sln")
SET(XERCES_SOLUTIONS "${XERCES_SOLUTION_DIR}/*.sln")
SET(XERCES_PROJECTS "${XERCES_SOLUTION_DIR}/*.vcxproj")
SET(XERCES_LIB_PROJECT "${XERCES_SOLUTION_DIR}/XercesLib/XercesLib.vcxproj")
STRING(REGEX REPLACE "/" "\\\\" XERCES_SOLUTIONS_WIN ${XERCES_SOLUTIONS})
STRING(REGEX REPLACE "/" "\\\\" XERCES_PROJECTS_WIN ${XERCES_PROJECTS})
include(ExternalProject)
ExternalProject_Add(
${TARGET_NAME}
DEPENDS fart
URL ${CMAKE_CURRENT_SOURCE_DIR}/xerces-c-${XERCESC_VERSION}.tar.gz
DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
PATCH_COMMAND ${FART_DIR}/bin/$<CONFIGURATION>/fart.exe -v -r --svn -- ${XERCES_SOLUTIONS_WIN},${XERCES_PROJECTS_WIN} "Static " Static_
COMMAND ${FART_DIR}/bin/$<CONFIGURATION>/fart.exe -v -r --svn -- ${XERCES_SOLUTIONS_WIN},${XERCES_PROJECTS_WIN} <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
COMMAND ${FART_DIR}/bin/$<CONFIGURATION>/fart.exe -v -r --svn -- ${XERCES_SOLUTIONS_WIN},${XERCES_PROJECTS_WIN} <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
CONFIGURE_COMMAND ""
BUILD_COMMAND msbuild ${XERCES_LIB_PROJECT} /m /property:Configuration=Static_Release,Platform=x64 /property:DefineConstants=XERCES_STATIC_LIBRARY
COMMAND msbuild ${XERCES_LIB_PROJECT} /m /property:Configuration=Static_Debug,Platform=x64 /property:DefineConstants=XERCES_STATIC_LIBRARY /property:DefineDebug=true
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1
)
SET(LIBRARIES debug ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/Build/Win64/${VC_PROJ_DIR}/Static_Debug/xerces-c_static_3D.lib)
SET(LIBRARIES ${LIBRARIES} optimized ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/Build/Win64/${VC_PROJ_DIR}/Static_Release/xerces-c_static_3.lib)
SET(INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/src/)
ELSE(WIN32)
https://stackoverflow.com/questions/32847966
复制相似问题