2008-12-02 14 views
18

मैं इस त्रुटि मिलती है में पहले से ही है:पुनः संकलित करें, लेकिन जब मैं मेकअप करना विकल्प makefile

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

इसमें कहा गया है कि मैं -fPIC विकल्प के साथ पुन: संयोजित करना चाहिए। मैंने ऐसा किया, -fPIC विकल्प CFLAGS और CXXFLAGS पर विकल्प, लेकिन मुझे अभी भी वही त्रुटि मिलती है। क्या इसका हल करने का कोई तरीका है? मैंने देखा है कि यह समस्या 64-बिट मशीन के उपयोग से संबंधित है, और यह सच है कि मैं एक का उपयोग कर रहा हूं।

+0

इस लिंकर या संकलक से एक त्रुटि है? क्या आपने रीकंपलिंग से पहले सभी ऑब्जेक्ट फ़ाइलों को साफ़ किया था? – philant

+1

हां यह संकलक से एक त्रुटि है और हाँ मैं सभी वस्तुओं को साफ़ करता हूं और मुझे अभी भी वही त्रुटि मिलती है। धन्यवाद। – Eduardo

+0

संबंधित प्रश्न http://stackoverflow.com/questions/1250608/passing-a-gcc-flag-through-makefile मेरा पोस्ट करने से पहले आपकी जांच करनी चाहिए थी। –

उत्तर

9

मुझे यह समस्या थोड़ी देर पहले आई थी और अगर मुझे सही याद है, तो फिक्स कमांड लाइन में जीसीसी के बाद -पीपीआईसी के प्लेसमेंट को ले जा रहा था। पूरी तरह से कोई समझ नहीं आया, और अब इतना कम है, लेकिन जैसा कि मुझे याद है, यह तय है।

+1

यह मेरे लिए भी काम करता था। .. मेकफ़ाइल यानी सीसी = gcc -pthread -fPIC – ashishsony

+0

में जीसीसी के बाद सीधे -एफपीआईसी जोड़ना मुझे एक ही समस्या का सामना करना पड़ा। "gcc" (जैसा आपने लिखा था) के बाद सीधे "-fPIC" को आगे बढ़ाना मेरे लिए भी काम करता था। पेचीदा। – cmo

+0

'जीसीसी' के साथ आपके द्वारा उपयोग किए जाने वाले अन्य झंडे क्या थे? @ashishsony हालांकि आपका उदाहरण 'gcc' के बाद सीधे '-fPIC' नहीं दिखाता है। – icedwater

4

मुझे एक ही समस्या का सामना करना पड़ा, लेकिन इसमें एक अतिरिक्त मोड़ था। @clintm द्वारा जवाब इसे हल है, लेकिन मैंने सोचा कि मैं 32-बिट मशीन पर भविष्य में संदर्भ के लिए यहाँ समस्या की मेरी भिन्नता का वर्णन होगा ...

Makefile:

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

libmylibrary.so: $(OBJECTS) 
    $(CXX) -shared -Wl,-soname,[email protected] -o [email protected] $(OBJECTS) 

यह सही ढंग से संकलित। लेकिन जब मैंने 64-बिट मशीन पर कोशिश की तो उसी मेकफ़ाइल विफल हो गई। मैंने "-fpic" से "-fPIC" बदल दिया और यह अभी भी असफल रहा। मैं करने के लिए वस्तु नियम बदल दिया है:

%.o: %.c 
    $(CXX) -fPIC $(CXXFLAGS) -c $< 

और यह अभी भी विफल रहा है।

अंत में, मैं वास्तविक संकलक चर में "-fPIC" रखा (तो अब "-fPIC" प्रत्येक वस्तु और साझा लाइब्रेरी के लिए शासन के लिए नियम में प्रकट होता है कि):

CXX=g++ -fPIC 
CXXFLAGS= -g -O3 -Wall 
... 
%.o: %.c 
     $(CXX) $(CXXFLAGS) -c  -o [email protected] $< 

libalglib.so: $(OBJECTS) 
     $(CXX) -shared -Wl,-soname,[email protected] -o [email protected]  $(OBJECTS) 

और यह काम किया!

0

परियोजना आप को संकलित करने के लिए करना चाहते हैं इस तरह की एक सही कॉन्फ़िगर स्क्रिप्ट प्रयोग है यदि:

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

तो झंडा सभी Makefile के शासन हो जाएगा ...

कुछ ही दिन पहले i ' एक बुजुर्ग ver की जरूरत है।

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

TARGET = libmyawesomelib.a 

all: $(TARGET) main 

बस इतनी तरह -fPIC फ्लैग जोड़ने: की वीएलसी एक x64 मशीन पर संकलित करने के लिए, यह एक अच्छा कॉन्फ़िगर स्क्रिप्ट ;-)

0

मान लीजिए कि आप जैसे कुछ makefile करते है

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

तो मेकफ़ाइल के बाकी हिस्सों के साथ आगे।

0

मैं इस समस्या में एंड्रॉइड-एनडीके टूलचेन के साथ क्रॉस-कंपाइलिंग में भाग गया। मैं का उपयोग करने के

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

न तो -fPIC और न ही -fPIE इस स्थिति में मेरे लिए काम किया हो रही समाप्त हो गया।

संबंधित मुद्दे