22

制作时出现此错误:

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

它说我应该使用该-fPIC选项重新编译。我这样做了,将-fPIC选项添加到CFLAGSand CXXFLAGS,但我仍然得到同样的错误。有没有办法解决这个问题?我已经看到这个问题与使用64位机器有关,而且我使用的是一个。

4

7 回答 7

12

我很久以前就遇到过这个问题,如果我没记错的话,修复是在命令行中将 -fPIC 的位置移动到 gcc 之后。完全没有意义,现在更少了,但我记得,这解决了它。

于 2008-12-03T03:22:55.913 回答
5

我遇到了同样的问题,但它有一个额外的转折。@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)

它奏效了!

于 2013-01-21T15:18:33.523 回答
0

假设您有一些makefile,例如:

CFLAGS = -g -Wall
SOURCES = $(wildcard *.c)
OBJECTS = ...

TARGET = libmyawesomelib.a

all: $(TARGET) main

只需像这样添加 -fPIC 标志:

$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
        .
        .
        .

以此类推,其余的makefile。

于 2014-10-03T01:30:52.880 回答
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 
于 2017-02-17T08:39:35.153 回答
0

我在使用 android-ndk 工具链进行交叉编译时遇到了这个问题。我最终不得不使用

CC="$CROSS/bin/arm-linux-androideabi-gcc -pie --sysroot=$SYSROOT"

在这种情况下,既不适合我,-fPIC也不适合我。-fPIE

于 2015-10-12T01:53:48.153 回答
0

我升级 gcc 后遇到了这个问题。我有一个 .o 文件(sqlite)没有被 Makefile 清理,因此我遇到了这个问题(假设因为它是用旧版本的 gcc 编译的)。删除该文件并重建后,此错误消失了。

于 2018-06-21T18:44:34.527 回答
-1

如果您要编译的项目具有正确的配置脚本,请使用如下:

$ ./configure 'CFLAGS=-g -O2 -fPIC ....' --enable-some-thing

所以标志将是Makefile的所有规则......

几天前我需要一个老版本。VLC 在 x64 机器上编译,它有一个很好的配置脚本;-)

于 2013-04-18T12:31:22.123 回答