使用-Wl,-E链接,这意味着什么?

6

我正在处理一个项目,我们使用的是带有CPP-API的Basler Pylon相机。除了拍照之外,我们大部分的代码都是用Python编写的,因此我们使用swig来包装来自CPP的take_image()函数。

这些是我们对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非常重要,"否则链接器将无法正确地在运行时知道和匹配pylon符号"。我查看了g++的man-page,发现-Wl用于向链接器传递选项,但无法弄清楚当传递到-Wl时-E选项会做什么。有人知道吗?
仅当从python调用拍照功能时,运行时问题才会显现。因此,仅使用-Wl,-E合并cppcamera.cpp的标准编译正常工作,但创建由python中的包装器使用的共享库时缺少某些东西/不正确。您对我们的g++调用可能缺少什么有任何建议吗?

伙计?保罗?我爱你!由于这个genicam,我无法让链接器创建我的可执行文件。通过一些你的链接器选项,我终于让它工作了。谢谢! - Bitterblue
1个回答

3
您可以查看 ld 的帮助手册(如果 gcc 设置为使用 ld 作为链接器):

-E
--export-dynamic
--no-export-dynamic

在创建动态链接可执行文件时,使用 -E 选项或 --export-dynamic 选项会导致链接器将所有符号添加到动态符号表中。 动态符号表是运行时从动态对象可见的符号集。

如果您不使用这些选项(或使用 --no-export-dynamic 选项以恢复默认行为),则动态符号表通常仅包含链接中提到的某些动态对象引用的那些符号。

如果您使用 dlopen 加载需要引用程序定义的符号而不是其他动态对象的动态对象,则在链接程序本身时可能需要使用此选项。

如果输出格式支持,您还可以使用动态列表来控制应将哪些符号添加到动态符号表中。请参见 --dynamic-list 的说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接