我在制作时遇到此错误:
relocation R_X86_64_32 against `vtable for Torch::MemoryDataSet' can not be used
when making a shared object; recompile with -fPIC
它说我应该使用-fPIC
选项重新编译。我做到了,补充道
-fPIC
和CFLAGS
的{{1}}选项,但我仍然遇到同样的错误。有什么方法可以解决这个问题吗?我已经看到这个问题与64位机器的使用有关,我确实使用了这个问题。
答案 0 :(得分:10)
我有这个问题已经有一段时间了,如果我没记错的话,修复就是在命令行中的gcc之后移动-fPIC的位置。完全没有意义,现在不那么有意思,但是我记得,那就修好了。
答案 1 :(得分:4)
我遇到了同样的问题,但它有一个额外的扭曲。 @clintm的答案解决了这个问题,但我想我会在这里描述问题的变化以供将来参考......
32位机器上的Makefile:
CXX=g++
CXXFLAGS= -O3 -Wall
...
...
%.o: %.c
$(CXX) $(CXXFLAGS) -fpic -c $<
libmylibrary.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
这个编译正确。但是当我在64位计算机上尝试时,同样的Makefile失败了。我将“-fpic”更改为“-fPIC”,但仍然失败了。我将对象规则更改为:
%.o: %.c
$(CXX) -fPIC $(CXXFLAGS) -c $<
它仍然失败。
最后,我将“-fPIC”放在实际的编译器变量中(现在“-fPIC”出现在规则中,每个对象和共享库的规则):
CXX=g++ -fPIC
CXXFLAGS= -g -O3 -Wall
...
%.o: %.c
$(CXX) $(CXXFLAGS) -c -o $@ $<
libalglib.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
它有效!
答案 2 :(得分:0)
如果您要编译的项目具有正确的配置脚本,请使用如下:
$ ./configure 'CFLAGS=-g -O2 -fPIC ....' --enable-some-thing
所以标志将是所有Makefile的规则...
我需要一个老年人的前几天。要在x64机器上编译VLC,它有一个很好的配置脚本; - )
答案 3 :(得分:0)
假设你有一些makefile:
CFLAGS = -g -Wall
SOURCES = $(wildcard *.c)
OBJECTS = ...
TARGET = libmyawesomelib.a
all: $(TARGET) main
只需添加-fPIC标志,如下所示:
$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
.
.
.
等等与makefile的其余部分一起使用。
答案 4 :(得分:0)
我遇到了使用android-ndk工具链进行交叉编译的问题。我最终不得不使用
CC="$CROSS/bin/arm-linux-androideabi-gcc -pie --sysroot=$SYSROOT"
在这种情况下,-fPIC
和-fPIE
都不适合我。
答案 5 :(得分:0)
我在CentOS 7机器上交叉编译shadowsocks-libev,同样的问题发生在我身上,它在我的笔记本电脑上完美运行
CC=mipsel-unknown-linux-uclibc-gcc CXX=mipsel-unknown-linux-uclibc-g++ AR=mipsel-unknown-linux-uclibc-ar RANLIB=mipsel-unknown-linux-uclibc-ranlib make SHARED=1 CFLAGS=-fPIC
但是在travis ci上,它不起作用,我必须将-fPIC添加到CC和CXX才能使其正常工作
CC="mipsel-unknown-linux-uclibc-gcc -fPIC" CXX="mipsel-unknown-linux-uclibc-g++ -fPIC" AR=mipsel-unknown-linux-uclibc-ar RANLIB=mipsel-unknown-linux-uclibc-ranlib make SHARED=1
答案 6 :(得分:0)
升级gcc后出现此问题。我有一个.o文件(sqlite)尚未由Makefile清除,结果我遇到了这个问题(假设因为它是用较旧版本的gcc编译的)。删除该文件并重建后,该错误消失了。