2012-12-12 42 views
2

我是Linux新手,我在編譯在32位機器上運行良好的make文件時遇到了問題。我沒有寫這個程序,但我需要它來使用它的功能。我的機器是64位的,我得到以下信息的錯誤:PIC編譯 - 錯誤:重定位R_X86_64_32S針對`vtable for hit'無法在創建共享對象時使用;使用-pPIC重新編譯

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以PIC編譯共享庫。我在全球範圍內添加了「導出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 [email protected] $(OBJS) 

%.o: %.cc 
    $(CXX) $(CFLAGS) -c -o [email protected] $< 

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 [email protected] $(OBJS) $(SHARED) 

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

%.o: %.cxx 
    $(CXX) $(CFLAGS) -c -o [email protected] $< 

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 

希望有人能幫助我。 在此先感謝! Daniel

回答

1

您的生成文件使用$CFLAGS而不是$CXXFLAGS。 您必須全局添加-fPICexport CXXFLAGS=$CXXFLAGS -fPIC)或在生成文件的右邊行(例如CFLAGS = $(shell $(ROOTCONFIG) --cflags) -I../pmtTools)。

從錯誤消息中,我猜想只添加到第二個makefile可能就足夠了。

相關問題