我正在尝试在一些已经存在的c ++代码之上添加一个Swig接口,并且我在-fPIC
标志中出现了一些错误。
如果我在没有-fPIC
的情况下编译现有代码,然后使用:
swig -python -c++ pyinterface.i
gcc -fPIC $(CFLAGS)-I $(PYTHON_INCLUDE_DIR) -c pyinterface_wrap.cxx
g++ -shared -o _pyinterface.so pyinterface_wrap.o -I $(PYTHON_INCLUDE_DIR) -L $(PYTHON_LIB_DIR) $(LPATH) $(LFLAGS) $(IPATH) $(LIBS)
然后我得到了
warning: creating a DT_TEXTREL in object
然而,该模块似乎确实加载并在Python中工作。
如果我使用-fPIC
编译已经存在的代码,然后执行相同的操作来创建我的模块,当我尝试将其导入python时:
import pyinterface
然后我收到错误
ImportError: ./_pyinterface.so: undefined symbol: _Z7InitErfPA20_d
我不知道为什么会这样。但是,在我尝试包装的基本c ++文件的补充中,它们会链接到某些标准库,例如-llapack
。
可能是因为我需要使用-fPIC
重新编译这些基本库,例如lapack。这似乎很疯狂。
编辑:
实际上很遗憾,我没有意识到,但是在编译期间我遇到了-fPIC标志错误:
g++: Internal error: Killed (program cc1plus)
请提交完整的错误报告。 有关说明,请参阅http://bugs.gentoo.org/。
如果我弄清楚会发生什么,我会更新这个问题,但似乎它可能与问题实际提出的任何事情无关。
答案 0 :(得分:0)
关于这个回复,我可能错了。
关于警告:在对象
中创建DT_TEXTREL即使我收到同样的警告。
在我的Makefile中;我做过类似的事情
SRC = ../../some_folder/file.c 1.c 2.c
OBJS = $(SRC:.c = .o)
在制作共享对象时,我正在使用这个$(OBJS);而“file.o”将在该位置可用。
确保您尝试访问的目标文件在该位置可用。
当我做出以下更改时,我的警告消息消失了
OBJS = file.o 1.o 2.o