Я пытаюсь понять ошибку, которую я вижу на 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_Document12CreateNewDocEv 'в /home/bradh/pdfium/install/lib/pdfium/libfpdfapi.a(fpdf_parser_fdf.o) ссылается DS / usr / bin / ld: ошибка последней ссылки: неверное значение collect2: error: ld вернул 1 состояние выхода
Я понимаю, что означает ошибка (см. Что именно означает предупреждение о том, что DSO ссылается на скрытый символ?), и я знаю, как это исправить — везде отключить скрытую видимость или установить для двух проблемных классов видимость по умолчанию (по атрибуту или declspec).
Чего я не понимаю, так это того, почему на эти конкретные классы есть ссылки — они не используются напрямую в GDAL исходный код.
Используя nm, для комментария они появляются в общей библиотеке gdal.so.20.0.0:
U _ZN13CFDF_Document12CreateNewDocEv
(U == не определено). Это согласуется с частью «ссылка» из ошибки компоновщика, но не говорит мне, почему на нее ссылаются.
Возможно, есть некоторые встраивания, которые означают, что они используются — но теперь я догадываюсь, и я бы предпочел не делать этого. Тем более, что я, кажется, неправильно угадываю.
Так что вопрос в том, есть ли какой-нибудь способ отладки логики компоновщика — как-то выяснить Зачем компоновщик хочет попытаться разрешить эти символы?
Задача ещё не решена.