使用-fPIC选项重新编译,但该选项已在makefile中

时间:2008-12-02 01:31:39

标签: makefile recompile fpic

我在制作时遇到此错误:

relocation R_X86_64_32 against `vtable for Torch::MemoryDataSet' can not be used 
when making a shared object; recompile with -fPIC

它说我应该使用-fPIC选项重新编译。我做到了,补充道 -fPICCFLAGS的{​​{1}}选项,但我仍然遇到同样的错误。有什么方法可以解决这个问题吗?我已经看到这个问题与64位机器的使用有关,我确实使用了这个问题。

7 个答案:

答案 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编译的)。删除该文件并重建后,该错误消失了。