我正在做一个项目,我们使用的是一个带有CPP的Basler Pylon相机。除了图片拍摄之外,我们的大多数其他代码都是用Python编写的,因此我们使用swig包装来自CPP的take_image()-function。
以下是我们对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它编译得很好,但在运行时,当试图创建一个相机对象时,会抛出一个异常,该异常似乎与未解决的符号有关。根据camera手册,标志-Wl,-E非常关键,“否则链接器将无法在运行时正确地知道和匹配塔架符号”。我查阅了g++的手册页,意识到-Wl用于将选项传递给链接器,但不知道当传递给-Wl时-E选项会做什么。有没有人?
只有当从python调用拍照函数时,运行时问题才会显现出来。因此,只有cppcamera.cpp的标准编译结合了-Wl,-E才能正常工作,但是当我们在python中创建包装器使用的共享库时,有些东西是不正确的/缺失的。对于g++调用中可能缺少的内容,有什么建议吗?
发布于 2012-02-25 15:10:10
您可以检查help manual of ld (如果gcc被设置为使用ld作为链接器):
-E
--export-dynamic
--no-export-dynamic
在创建动态链接的可执行文件时,使用-E选项或--export-dynamic选项会使链接器将所有符号添加到动态符号表中。动态符号表是运行时从动态对象中可见的符号集。
如果不使用这些选项(或使用--no-export-dynamic选项恢复默认行为),动态符号表通常只包含链接中提到的某些动态对象引用的符号。
如果使用dlopen加载需要引用程序定义的符号的动态对象,而不是其他动态对象,则在链接程序本身时可能需要使用此选项。
如果输出格式支持动态符号表,还可以使用动态列表来控制应该添加哪些符号。请参阅--dynamic-list.的说明。
https://stackoverflow.com/questions/9444035
复制相似问题