2013-04-26 21 views
1

在与我的makefile问题作斗争之后,我现在讨论了两个库应该如何交互的问题。所以,这是在Linux上(CentOS 6.2 - 6.4,这似乎在工具方面差异很大)。项目,从总体上看,是两种口味在混合库类型(静态和动态)方面存在问题

,其用于与其他C++ appications联(A *某文件)
  • A C++静态库
  • 共享*。所以要被部署通过蟒蛇使用Boost.python部署

我有一切编译,但我没有正确链接。在静态库的情况下,它是建立在两个方面:

  • 如果为了与其他C++代码链接,-fPIC使用
  • 如果意味着要链接到Python模块, 使用-fPIC

我通过传递参数给make程序进行控制。目前,我正在尝试构建boost python模块,因为静态的东西编译得很好。所以,我依赖boost库和zlib。最终连接命令看起来像这样:

g++ -o pythonmod.so -L/boost/boost_libs -L/zlibs -lz -lboost_python -lboost_thread -lboost_regex -lboost_system /path/to/static.a -fPIC -shared [many_objects] 

的“many_objects”来自于各种包装,和其他代码,即从包装在代码中的Boost.Python层中的“纯” C++。这些目标文件中的每一个都使用-fPIC编译。他们编译为:

g++ -I/boost/boost_1_47 -I/usr/include/python2.6 -D _linux -MMD -std=c++0x -c -m32 -fPIC <input> -o <output> 

编译归档文件的目标文件的行看起来与上面非常相似,只是它们不包括python include目录。

我在这里发现了类似问题的其他链接,并尝试了解决方案,但迄今为止无济于事。例如,this link使用-Wl,--whole-archive ... -Wl,--no-whole-archive。我在尝试在静态库存档中链接-fPIC之前尝试使用此解决方案。现在,我正在这样做,我试过this solution,但也无济于事。在每种情况下,每次我加载python并导入模块时,都会遇到某种未定义的符号错误 - >链接期间出错。

我应该如何将这些库混合在一起以使python模块工作?

回答

0

加入gcc-help邮件列表后,我收到了解决问题所需的指针。问题原来是用于在构建命令行上进行链接的库的排序。基本上,构建期间为* .so生成的目标文件需要首先放置。然后,引用boost和其他库。重新排序目标文件以引用在其他库之前构建的用于封装静态库的对象是关键。加载我的python模块时,我不再看到奇怪的“未解决的对象”。

在使用Visual Studio 4或5年后,我的gcc知识已经变得足够生锈,以至于我忘记了链接时排序的重要性。