XALAN-C 1.12 - 静态构建时出现奇怪的错误

问题描述 投票:0回答:1

我需要静态构建和链接 Xerces-C(3.2.5/最新)和 Xalan-C(1.12/最新)库。

Xerces 3.2.5 是静态构建的,没有任何问题。 我只是像这样运行 CMake 命令:

cmake . -A Win32 -DBUILD_SHARED_LIBS:BOOL=OFF

它生成了 VS 项目,然后我运行

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

然后在 VS 2012 中打开它并尝试构建,但它失败并出现很多错误,如下所示:

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

我检查了 VS2012 IDE 中的所有编译器和链接器设置的项目属性 - 我找不到任何可能影响它的内容。 :-\

您能否提供建议 - 是否可以静态构建 Xalan-C 1.12? 或者构建配置是否存在错误?

因为在“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 不可能静态构建。

但也许我错过了什么?... 可以请您指教吗?

因此,“MRE 场景”如下:

  1. 下载 Xerces-C - https://dlcdn.apache.org//xerces/c/3/sources/xerces-c-3.2.5.zip

1.1) 解压到“D:\libs\ApacheXML\xerces-c-3.2.5”

1.2)创建cmk.cmd脚本(见上文)

1.3)使用 CMake 或 VS 构建它(我尝试了 VS2012 和 VS2022 - 两者都适用于 Xerces-C 静态库构建)

  1. 下载 Xalan-C - https://dlcdn.apache.org/xalan/xalan-c/sources/xalan_c-1.12.zip

2.1) 解压到“D:\libs\ApacheXML\xalan_c-1.12”

2.2) ...等等

c++ static xalan
1个回答
0
投票

据发现 - 我只需要更改 XALAN 中的 2 个头文件即可使 Windows 上的静态构建正常工作:

  • “xalan_c-1.12 \ src \ xalanc \ Include \ PlatformDefinitions.hpp”
  • “xalan_c-1.12\src\xalanc\XPathCAPI\XPathCAPI.h”

在这两个文件中我只需要注释掉

__declspec(dllimport)
代码,如下所示:
/* __declspec(dllimport) */

至此XALAN 1.12静态版本就构建成功了。然后我可以将其链接到我的测试应用程序并且它可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.