我正在尝试使用boost-python编写一个非常简单的模块,并试图手工进行编译,并试图找出需要哪些步骤来指导编译器CLI生成与位置无关的代码。
我注意到,只有在链接时(并且根本不提供),才提供参数Root/
- Controller
-- Module1
--- Controller
--- Controller
-- Module2
--- Controller
--- Controller
- Model
-- Module1
--- Model
--- Model
-- Module1
--- Model
--- Model
- Repository
...
...
- Service
...
...
- WEB-INF
-- Views
--- Module1
---- .jsp
---- .jsp
--- Module2
---- .jsp
---- .jsp
才能获得功能正常的可从Python加载的共享对象。
在下面的ERP
中,仅在生成-fPIC
时提供build.sh
,而在生成中间-fPIC
对象文件时则不提供:
.so
这将产生一个可以运行的共享对象:
.o
当最后一个#!/bin/bash
INCLUDES=" -I /usr/local/Cellar/boost/1.68.0_1/include"
INCLUDES+=" -I $(dirname $(dirname $(which python)))/include/python*"
LINKARGS=" -lpython -lboost_python37"
# compile object
clang++ $INCLUDES -o hello.o -c hello.cpp
# link into shared object
clang++ -shared -fPIC $LINKARGS -o hello.so hello.o
不存在且最后一行为> python test_hello.py
hello, world
build.sh
脚本还会生成可加载的共享对象
所以,我的问题是:
-fPIC
? clang++ -shared $LINKARGS -o hello.so hello.o
是否已经固有地嵌入了位置无关性,还是在链接时有效地选择了位置无关性?不同文件的源代码:
-fPIC
和.o
// hello.cpp
char const* greet()
{
return "hello, world";
}
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello)
{
using namespace boost::python;
def("greet", greet);
}
test_hello.py
脚本非常特定于OS X,通过自制程序安装的# test_hello.py
import hello
print (hello.greet())
和build.sh
中的Python 3.7。