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

Edu*_*rdo 21 makefile recompile fpic

我做make时遇到这个错误:

relocation R_X86_64_32 against `vtable for Torch::MemoryDataSet' can not be used 
when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)

它说我应该重新编译-fPIC选项.我这样做,将-fPIC选项添加到CFLAGSCXXFLAGS,但我仍然得到相同的错误.有什么方法可以解决这个问题吗?我已经看到这个问题与使用64位机器有关,而且我确实使用了一个.

cli*_*ntm 10

很长一段时间我遇到了这个问题,如果我没记错的话,修复工具就是在命令行中的gcc之后移动-fPIC的位置.完全没有意义,现在也不那么有意思,但是我记得,那就修好了.


cmo*_*cmo 5

我遇到了同样的问题,但它有一个额外的转折。@clintm 的答案解决了它,但我想我会在这里描述我的问题变化以供将来参考......

32 位机器上的 Makefile:

CXX=g++
CXXFLAGS= -O3 -Wall
...
...   
%.o:  %.c
    $(CXX)  $(CXXFLAGS)  -fpic  -c  $<      

libmylibrary.so: $(OBJECTS)
    $(CXX) -shared -Wl,-soname,$@ -o $@   $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

这编译正确。但是当我在 64 位机器上尝试它时,同样的 Makefile 失败了。我将“-fpic”更改为“-fPIC”,但它仍然失败。我将对象规则更改为:

%.o:  %.c
    $(CXX)  -fPIC  $(CXXFLAGS)  -c  $< 
Run Code Online (Sandbox Code Playgroud)

它仍然失败。

最后,我在实际的编译器的变量置于“-fPIC”(使得现在的“-fPIC”出现在每个对象的规则用于共享库中的规则):

CXX=g++  -fPIC
CXXFLAGS= -g -O3 -Wall
...
%.o:  %.c
        $(CXX)    $(CXXFLAGS)   -c      -o $@    $<   

libalglib.so: $(OBJECTS)
        $(CXX) -shared -Wl,-soname,$@  -o $@      $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

它奏效了!