You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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静态编译失败,执行如下配置脚本:
    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=inmemory
    
    在VS2012中编译时出现大量C2491错误,示例如下:
    Error   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中的定义:
    #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
    
    怀疑该定义存在问题,不确定是否遗漏配置,咨询:是否可静态构建Xalan-C 1.12?是否存在构建配置bug?

完整复现步骤

  1. 下载Xerces-C 3.2.5,解压至D:\libs\ApacheXML\xerces-c-3.2.5
  2. 执行对应CMake命令,用VS2012/2022编译,静态库构建成功
  3. 下载Xalan-C 1.12,解压至D:\libs\ApacheXML\xalan_c-1.12
  4. 执行上述配置脚本并编译,出现C2491错误
解决方案

Xalan-C 1.12可以静态构建,问题出在CMake配置未正确处理静态编译下的导出宏,导致代码错误使用__declspec(dllimport)。

修复步骤

  1. 调整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
    
  2. 验证宏定义(可选)
    添加XALAN_STATIC_LIBRARY后,CMake会在生成的项目中自动定义该预处理器宏,此时PlatformDefinitions.hpp会自动将XALAN_PLATFORM_EXPORT和XALAN_PLATFORM_IMPORT设为空,不再使用__declspec(dllexport/dllimport),解决C2491错误。

  3. 重新生成并编译
    执行cmake --build . --clean-first --config Release重新编译,即可完成静态库构建。

说明

Xalan-C的CMake脚本中,BUILD_SHARED_LIBS仅控制是否构建共享库,但Xalan-C自身需XALAN_STATIC_LIBRARY宏切换静态编译模式下的导出规则,这是容易遗漏的配置点,并非官方构建配置bug。

内容的提问来源于stack exchange,提问作者dmitry_bond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:23:12