链接-Wl,-E,它是什么意思等?

时间:2012-02-25 12:37:14

标签: python linux g++ swig

我正在开发一个项目,我们正在使用带有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调用图片拍摄功能时才会显现。所以只是标准编译的cppcamera.cpp合并-Wl,-E工作正常,但是当我们创建python中的包装器使用的共享库时,某些东西不正确/缺失。关于我们的g ++中可能缺少什么的任何建议 - 调用?

1 个答案:

答案 0 :(得分:3)

您可以查看help manual of ld(如果gcc设置为使用ld作为链接器):

  

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

     

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

     

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

     

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

     

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