【问题标题】:PIC compilation - error: relocation R_X86_64_32S against `vtable for hit' can not be used when making a shared object; recompile with -fPICPIC 编译 - 错误:创建共享对象时无法使用针对“vtable for hit”的重定位 R_X86_64_32S;使用 -fPIC 重新编译
【发布时间】:2012-12-12 10:41:30
【问题描述】:

我是 Linux 新手,在编译一个在 32 位机器上运行良好的 make 文件时遇到了麻烦。我没有编写这个程序,但我需要它来使用它的功能。我的机器是 64 位的,我收到以下消息错误:

cd pmtTools;    make 
make[1]: Entering directory `/home/daniel/Documents/Master_thesis/data_Daniel-Thomas/photondet/trace/PMTSignalsAnalysis/pmtTools'
g++ -shared  -L/home/root/root/lib -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -pthread -lm -ldl -rdynamic -o libPmtTools.so hit.o event.o waveform.o readLeCroyBinary.o pmtToolsDict.o
/usr/bin/ld: hit.o: relocation R_X86_64_32S against `vtable for hit' can not be used when making a shared object; recompile with -fPIC
hit.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[1]: *** [libPmtTools.so] Error 1
make[1]: Leaving directory `/home/daniel/Documents/Master_thesis/data_Daniel-Thomas/photondet/trace/PMTSignalsAnalysis/pmtTools'
make: *** [all] Error 2

我一直在尝试通过使用这个网站来解决这个问题,但我没有让程序工作......http://www.gentoo.org/proj/en/base/amd64/howtos/index.xml?part=1&chap=3 我不习惯使用 makefile,这就是为什么我无法正确修改 makefile 以通过 PIC 编译共享库。我在全局范围内添加了标志'export CXXFLAGS=$CXXFLAGS -fPIC',但它没有用。我完全迷路了。

这里是 make 文件(两个 make 文件和一个调用它们的文件)。

ROOTCONFIG = $(ROOTSYS)/bin/root-config
ROOTCINT = $(ROOTSYS)/bin/rootcint
DOXYGEN = doxygen

CXX = $(shell $(ROOTCONFIG) --cxx)
LD = $(shell $(ROOTCONFIG) --ld)

CFLAGS = $(shell $(ROOTCONFIG) --cflags) 
LIBS  = $(shell $(ROOTCONFIG) --libs)
SOFLAGS = -shared 

CINTSRCS = event.cc hit.cc
CINTINCS = event.h hit.h

OBJS = hit.o event.o waveform.o readLeCroyBinary.o pmtToolsDict.o

LIBPMTTOOLS = libPmtTools.so

all: $(LIBPMTTOOLS)
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/Documents/Master_thesis/data_Daniel-Thomas/photondet/trace/PMTSignalsAnalysis/pmtTools

$(LIBPMTTOOLS): $(OBJS)
    $(LD) $(SOFLAGS) $(LIBS) -o $@ $(OBJS)

%.o: %.cc
    $(CXX) $(CFLAGS) -c -o $@ $<

pmtToolsDict.cc: $(CINTSRCS) $(CINTINCS) pmtToolsLinkDef.h
    @echo "Generating dictionary pmtToolsDict..."
    $(ROOTCINT) -f pmtToolsDict.cc -c -p $(CINTINCS) pmtToolsLinkDef.h

clean:
    rm -f pmtToolsDict.cc pmtToolsDict.h $(LIBPMTTOOLS) $(OBJS)

dox:
    rm -rf html
    $(DOXYGEN) pmtTools.dox

------------------------------2 ----- ---------------

ROOTCONFIG = $(ROOTSYS)/bin/root-config

CXX = $(shell $(ROOTCONFIG) --cxx)
LD = $(shell $(ROOTCONFIG) --ld)

CFLAGS = $(shell $(ROOTCONFIG) --cflags) -I../pmtTools 
LIBS  = $(shell $(ROOTCONFIG) --libs)# -L../pmtTools -lpmtTools

OBJS = analysis.o
SHARED = ../pmtTools/libPmtTools.so
EXE = analysis.exe

all:  $(EXE)

$(EXE): $(OBJS) $(SHARED)
    $(LD) $(LIBS) -o $@ $(OBJS) $(SHARED)

$(SHARED):
    cd ../pmtTools; make

%.o: %.cxx
    $(CXX) $(CFLAGS) -c -o $@ $<

test: test.cxx $(SHARED)
    $(CXX) $(CFLAGS) -c -o test.o test.cxx
    $(LD) $(LIBS) -o test.exe test.o $(SHARED)

clean:
    rm -f $(EXE) $(OBJS) test.o test.exe

--------------------------3------------------------ -

 all:
    cd pmtTools;    make 
    cd analysis;    make 

 clean:
    cd pmtTools;    make clean
    cd analysis;    make clean

希望有人可以帮助我。 提前致谢!! 丹尼尔

【问题讨论】:

    标签: 32bit-64bit relocation fpic


    【解决方案1】:

    您的 makefile 使用的是 $CFLAGS,而不是 $CXXFLAGS。 您必须将 -fPIC 全局添加 (export CXXFLAGS=$CXXFLAGS -fPIC) 或添加到 makefile 的右行(例如 CFLAGS = $(shell $(ROOTCONFIG) --cflags) -I../pmtTools)。

    从错误信息来看,我猜只添加到第二个 makefile 可能就足够了。

    【讨论】:

      猜你喜欢
      • 2017-07-23
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      相关资源
      最近更新 更多