Xalan-C 1.12静态编译报错求助:无法完成静态库构建
问题
需要静态编译并链接Xerces-C(3.2.5/最新版)与Xalan-C(1.12/最新版)库。
- Xerces-C 3.2.5静态编译无问题,执行以下CMake命令生成VS项目后编译成功:
cmake . -A Win32 -DBUILD_SHARED_LIBS:BOOL=OFF cmake --build . --clean-first --config Release - 但Xalan-C静态编译失败,执行如下配置脚本:
在VS2012中编译时出现大量C2491错误,示例如下:set BuildCfgName=Release set XERCES_ROOT=D:\libs\ApacheXML\xerces-c-3.2.5 set XercesC_LIBRARY=D:\libs\ApacheXML\libs\static\xerces-c_3.lib set XercesC_INCLUDE_DIR=%XERCES_ROOT%\src cmake . -A Win32 -DBUILD_SHARED_LIBS:BOOL=OFF -DXercesC_LIBRARY=%XercesC_LIBRARY% -DXercesC_INCLUDE_DIR=%XercesC_INCLUDE_DIR% -Dmessage-loader=inmemoryError 51 error C2491: 'xalanc_1_12::XalanDOMInit::s_initCounter' : definition of dllimport static data member not allowed D:\libs\ApacheXML\xalan_c-1.12\src\xalanc\XalanDOM\XalanDOMInit.cpp 27 [...] Error 88 error C2491: 'xalanc_1_12::TranscodeToLocalCodePage' : definition of dllimport function not allowed D:\libs\ApacheXML\xalan_c-1.12\src\xalanc\XalanDOM\XalanDOMString.cpp 1085 [...] Error 93 error C2491: 'xalanc_1_12::TranscodeFromLocalCodePage' : definition of dllimport function not allowed D:\libs\ApacheXML\xalan_c-1.12\src\xalanc\XalanDOM\XalanDOMString.cpp 1211 - 检查VS项目属性未发现异常,查看
src\xalanc\Include\PlatformDefinitions.hpp中的定义:
怀疑该定义存在问题,不确定是否遗漏配置,咨询:是否可静态构建Xalan-C 1.12?是否存在构建配置bug?#if defined(_MSC_VER) //<- this part is actual for compiling #define XALAN_PLATFORM_EXPORT __declspec(dllexport) #define XALAN_PLATFORM_IMPORT __declspec(dllimport) #define XALAN_PLATFORM_EXPORT_FUNCTION(T) XALAN_PLATFORM_EXPORT T #define XALAN_PLATFORM_IMPORT_FUNCTION(T) XALAN_PLATFORM_IMPORT T #else #define XALAN_PLATFORM_EXPORT #define XALAN_PLATFORM_IMPORT #define XALAN_PLATFORM_EXPORT_FUNCTION(T) T XALAN_PLATFORM_EXPORT #define XALAN_PLATFORM_IMPORT_FUNCTION(T) T XALAN_PLATFORM_IMPORT #endif
完整复现步骤
- 下载Xerces-C 3.2.5,解压至
D:\libs\ApacheXML\xerces-c-3.2.5 - 执行对应CMake命令,用VS2012/2022编译,静态库构建成功
- 下载Xalan-C 1.12,解压至
D:\libs\ApacheXML\xalan_c-1.12 - 执行上述配置脚本并编译,出现C2491错误
解决方案
Xalan-C 1.12可以静态构建,问题出在CMake配置未正确处理静态编译下的导出宏,导致代码错误使用__declspec(dllimport)。
修复步骤
调整CMake配置参数
静态编译时需额外添加-DXALAN_STATIC_LIBRARY=ON参数,告诉Xalan-C的CMake脚本当前构建静态库,自动处理XALAN_PLATFORM_EXPORT宏定义,避免dllimport错误。修改后的配置脚本如下:set BuildCfgName=Release set XERCES_ROOT=D:\libs\ApacheXML\xerces-c-3.2.5 set XercesC_LIBRARY=D:\libs\ApacheXML\libs\static\xerces-c_3.lib set XercesC_INCLUDE_DIR=%XERCES_ROOT%\src cmake . -A Win32 -DBUILD_SHARED_LIBS:BOOL=OFF -DXALAN_STATIC_LIBRARY=ON -DXercesC_LIBRARY=%XercesC_LIBRARY% -DXercesC_INCLUDE_DIR=%XercesC_INCLUDE_DIR% -Dmessage-loader=inmemory验证宏定义(可选)
添加XALAN_STATIC_LIBRARY后,CMake会在生成的项目中自动定义该预处理器宏,此时PlatformDefinitions.hpp会自动将XALAN_PLATFORM_EXPORT和XALAN_PLATFORM_IMPORT设为空,不再使用__declspec(dllexport/dllimport),解决C2491错误。重新生成并编译
执行cmake --build . --clean-first --config Release重新编译,即可完成静态库构建。
说明
Xalan-C的CMake脚本中,BUILD_SHARED_LIBS仅控制是否构建共享库,但Xalan-C自身需XALAN_STATIC_LIBRARY宏切换静态编译模式下的导出规则,这是容易遗漏的配置点,并非官方构建配置bug。
内容的提问来源于stack exchange,提问作者dmitry_bond
相关产品推荐
相关产品推荐

