Понимание логики компоновщика - скрытый символ

Я пытаюсь понять ошибку, которую я вижу на GCC 4.9.2 (на Ubuntu) во время ссылки.

Конкретным сценарием является компиляция новой версии GDAL с поддержкой pdfium. pdfium построен как статическая библиотека.

Сборка pdfium работает, но с GDAL возникает ошибка времени компоновки. Это выглядит как:

/ bin / bash /home/bradh/devel/gdal.git/gdal/libtool --mode = ссылка 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_lcopf - lfx_libopjj 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 / Библиотека /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.so -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: скрытый символ `_ZN13CFDF_Document12Cate На главную /bradh/pdfium/install/lib/pdfium/libfpdfapi.a(fpdf_parser_fdf.o) ссылается DSO
/usr/bin/ld: окончательная ссылка не удалась: неверное значение collect2: ошибка: ld вернул 1 состояние выхода

Я понимаю, что означает ошибка (см., Что именно означает предупреждение о скрытом символе, на который ссылается DSO?), И я знаю, как его исправить - отключить скрытую видимость повсюду или установить для двух проблемных классов видимость по умолчанию (с помощью атрибут или declspec).

Чего я не понимаю, так это того, почему на эти конкретные классы есть ссылки - они не используются напрямую в исходном коде GDAL.

Используя nm, для комментария они появляются в общей библиотеке gdal.so.20.0.0:

             U _ZN13CFDF_Document12CreateNewDocEv

(U == не определено). Это согласуется с частью "ссылка" из ошибки компоновщика, но не говорит мне, почему на нее ссылаются.

Возможно, есть некоторые встраивания, которые означают, что они используются - но теперь я догадываюсь, и я бы предпочел не делать этого. Тем более, что я, кажется, догадываюсь неправильно.

Таким образом, вопрос заключается в том, существует ли какой-либо способ отладки логики компоновщика - каким-то образом выяснить, почему компоновщик хочет попытаться разрешить эти символы?

0 ответов

Другие вопросы по тегам