cmake 错误:导出序号太大:104116

hc8w905p  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(163)

我从源代码构建Inkscape:

$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ..
$ ninja install

它返回如下错误。

[1002/1006] Building CXX object src/CMakeFiles/inkscape_base.dir/verbs.cpp.obj
[1003/1006] Linking CXX shared library bin\libinkscape_base.dll
FAILED: bin/libinkscape_base.dll src/libinkscape_base.dll.a
cmd.exe /C "cd . && C:\msys64\mingw64\bin\g++.exe  -fopenmp -m64 -mms-bitfields -mthreads -mwindows -pthread -std=c++11 -g   -shared -o bin\libinkscape_base.dll -Wl,--out-implib,src\libinkscape_base.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/inkscape_base.rsp  && cd ."
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Error: export ordinal too large: 104116
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

什么会导致这个错误以及如何解决它?
注意:我可以在没有-DCMAKE_BUILD_TYPE=Debug的情况下成功构建Inkscape。

j9per5c4

j9per5c41#

有太多的符号用于编译DLL,但我已经设法编译了Inkscape与构建风格“”和静态链接,使用以下命令:

cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=OFF -G Ninja ..
ninja install
lvmkulzt

lvmkulzt2#

在Windows平台上构建DLL时,有两种方法可以从DLL导出函数。一个是名字,即。一种是用__declspec(dllexport),另一种是用 * 序数 *。导出函数的序号是通过将其附加到.def文件中的函数名称来定义的,如here所述。
举例来说:

LIBRARY   MYLIB
EXPORTS
   ActionA   @1
   ActionB   @2
   ActionC   @3
   ActionD   @4

最大序号由Microsoft PE和COFF格式定义。它是一个16位整数,最大值为65535。
如果DLL是用.def文件构建的,则不太可能遇到问题,因为.def文件中的函数通常少于最大数量。当导出的函数在代码中显式修饰时也是如此。MSVC链接器不会从DLL导出其他函数。然而,在没有.def文件的情况下,GNU链接器导出了所有全局符号,并达到了这个错误消息的限制。使用ELF格式的操作系统(如Linux)则不存在此问题,因为限制是32位或64位,具体取决于构建类型,因此不会影响共享库.so
修复方法是定义.def文件并在链接步骤中传递它。虽然在GCC和CLANG中可以使用-fvisibility=hidden来实现specify the default visibility as hidden,但截至2022年,Windows不支持-fvisibility=hidden

相关问题