Связь с -Wl, -E, что это значит и т. Д.? - PullRequest
5 голосов
/ 25 февраля 2012

Я работаю над проектом, в котором мы используем камеру Basler Pylon, которая поставляется с CPP-API. Большая часть нашего другого кода, кроме фотосъемки, написана на Python, поэтому мы используем swig для переноса функции take_image () - из CPP.

Это наши вызовы swig и g ++:

swig -python -c++ frompytocpp.i

g++ -c -fpic  cppcamera.cpp frompytocpp_wrap.cxx
-I/opt/pylon/genicam/library/CPP/include -I/opt/pylon/include -DUSE_GIGE
-I/usr/include/python2.6

g++ -shared cppcamera.o frompytocpp_wrap.o -o _frompytocpp.so
-L/opt/pylon/lib64 -L/opt/pylon/lib -L/opt/pylon/genicam/bin/Linux64_x64
-L/opt/pylon/genicam/bin/Linux64_x64/GenApi/Generic -Wl,-E -lpylonbase
-lpylonutility

Он компилируется нормально, но во время выполнения при попытке создать объект камеры выдается исключение, которое, по-видимому, относится к неразрешенным символам. Согласно API-руководству по камере, флаг -Wl, -E имеет решающее значение, «иначе компоновщик не будет знать и правильно сопоставлять символы пилона во время выполнения». Я посмотрел man-страницу для g ++, понял, что -Wl используется для передачи параметров компоновщику, но не смог понять, что будет делать опция -E при передаче в -Wl. Кто-нибудь? * * 1006

Проблема времени выполнения проявляется только тогда, когда вызывается функция фотографирования из python. Так что просто стандартная компиляция cppcamera.cpp, включающая -Wl, -E, работает нормально, но что-то не так / отсутствует, когда мы создаем разделяемую библиотеку, используемую оболочкой в ​​python. Любые предложения о том, что может отсутствовать в наших вызовах g ++?

1 Ответ

3 голосов
/ 25 февраля 2012

Вы можете проверить справочное руководство по ld (если gcc настроено на использование ld в качестве компоновщика):

-E<br />--export-dynamic<br />--no-export-dynamic

При создании динамически связанного исполняемого файла с использованием параметра -E или --export-dynamic заставляет компоновщик добавить все символы в таблицу динамических символов. ДинамическийТаблица символов - это набор символов, которые видны из динамических объектов во время выполнения.

Если вы не используете ни одну из этих опций (или опцию --no-export-dynamic для восстановления поведения по умолчанию), динамический символТаблица обычно содержит только те символы, на которые ссылается некоторый динамический объект, упомянутый в ссылке.

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

Вы также можете использовать динамический список для управления тем, какие символы должны быть добавлены кдинамическая таблица символов, если формат вывода поддерживает это.Смотрите описание --dynamic-list.

...