默认情况下,libboostpython.a在编译时不使用-fPIC。但是我必须做一个python扩展,它是一个动态库,-fPIC链接到静态库。如何从boost.python编译-fPIC静态库(libboostpython.a)?
libboostpython.a
-fPIC
boost.python
wgxvkvu91#
您可以使用以下几个选项:
bjam ... cxxflags='-fPIC'
'-Wl,-rpath,$ORIGIN'
$ORIGIN
yqyhoc1h2#
请注意,如果您已经运行过一次bjam,则需要首先清除目标,通过应用-d+2来打印命令也很有帮助:
./bjam clean && ./bjam -d+2 link=static cxxflags="-fPIC" install
s2j5cfk03#
如果你手动编译它,应该可以这样做:g++ -fPIC -shared -I/usr/include/ -I/usr/include/python3 main.cpp -lpython3 -lboost_python3 -o example.so
g++ -fPIC -shared -I/usr/include/ -I/usr/include/python3 main.cpp -lpython3 -lboost_python3 -o example.so
3条答案
按热度按时间wgxvkvu91#
您可以使用以下几个选项:
bjam ... cxxflags='-fPIC'
。这将把每个boost源文件编译为位置无关的代码。'-Wl,-rpath,$ORIGIN'
标志链接可执行文件,这样当动态链接器搜索可执行文件所需的共享库时,它会在可执行文件所在的目录中查找它们。有关$ORIGIN
的更多详细信息,请参见man ld.so。yqyhoc1h2#
请注意,如果您已经运行过一次bjam,则需要首先清除目标,通过应用-d+2来打印命令也很有帮助:
s2j5cfk03#
如果你手动编译它,应该可以这样做:
g++ -fPIC -shared -I/usr/include/ -I/usr/include/python3 main.cpp -lpython3 -lboost_python3 -o example.so