1

我试图了解链接时在 GCC 4.9.2(在 ubuntu 上)上看到的错误。

具体场景是编译支持pdfium的新版GDAL。pdfium 被构建为一个静态库。

pdfium 构建工作,但 GDAL 发生链接时间错误。看起来像:

/bin/bash /home/bradh/devel/gdal.git/gdal/libtool --mode=link g++ gdalinfo.lo commonutils.lo /home/bradh/devel/gdal.git/gdal/libgdal.la -o gdalinfo libtool : 链接:g++ .libs/gdalinfo.o .libs/commonutils.o -o .libs/gdalinfo /home/bradh/devel/gdal.git/gdal/.libs/libgdal.so -L/home/bradh/pdfium/安装 -L/home/bradh/pdfium/install/lib/pdfium -L/usr/local/lib -L/usr/lib -lpdfium -lfpdfapi -lfpdftext -lformfiller -lpdfwindow -lfxedit -lfpdfdoc -lfxcodec -lfx_libopenjpeg -lfx_lcms2 - lfx_libjpeg -lfx_zlib -lfdrm -lfxge -lfreetype -lfx_agg -lfxcrt -lbigint /usr/local/lib/libfreexl.so -lodbc -lodbcinst -lkmldom -lkmlbase -lkmlengine -lkmlconvenience -lminizip -luriparser /usr/lib/x86_64-linux- gnu/libexpat.so -lxerces-c -ljasper -lnetcdf -lhdf5 /usr/lib/libmfhdfalt.so /usr/lib/libdfalt.so -lgif -lgeotiff /usr/lib/x86_64-linux-gnu/libtiff。所以 -lpng -lpq -lrt /usr/local/lib/libspatialite.so -ldl /usr/local/lib/libproj.so -lm -lpthread -lz /usr/local/lib/libgeos_c.so /usr/local/ lib/libgeos.so /usr/lib/x86_64-linux-gnu/libsqlite3.so -lpcre /usr/lib/x86_64-linux-gnu/libcurl.so -lxml2 -pthread
/usr/bin/ld: .libs/gdalinfo: /home/bradh/pdfium/install/lib/pdfium/libfpdfapi.a(fpdf_parser_fdf.o) 中的隐藏符号 `_ZN13CFDF_Document12CreateNewDocEv' 被 DSO 引用
/usr/bin/ld:最终链接失败:错误值
collect2:错误:ld 返回 1 个退出状态

我了解错误的含义(请参阅关于 DSO 引用隐藏符号的警告到底意味着什么?),并且我知道如何修复它 - 关闭所有地方的隐藏可见性,或将两个问题类设置为具有默认可见性(通过属性或 declspec)。

我不明白为什么要引用这些特定的类——它们没有直接在GDAL 源代码中使用。

使用 nm,根据评论,它们确实出现在 gdal.so.20.0.0 共享库中:

             U _ZN13CFDF_Document12CreateNewDocEv

(U == 未定义)。这与链接器错误中的“被引用”部分一致,但并没有告诉我为什么引用它。

也许有一些内联意味着它们被使用了——但现在我在猜测,我不想这样做。特别是因为我似乎猜错了。

所以问题是是否有某种方法可以调试链接器逻辑——以某种方式找出链接器为什么要尝试解析这些符号?

4

0 回答 0