2008-12-02 13 views
18

tôi nhận được lỗi này khi tôi làm thực hiện:Biên dịch lại với tùy chọn -fPIC, nhưng tùy chọn đã nằm trong makefile

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

Nó nói rằng tôi nên biên dịch lại với tùy chọn -fPIC. Tôi đã làm điều đó, thêm tùy chọn -fPIC vào CFLAGSCXXFLAGS, nhưng tôi vẫn gặp lỗi tương tự. Có cách nào để giải quyết vấn đề này không? Tôi đã thấy rằng vấn đề này liên quan đến việc sử dụng máy 64 bit, và đúng là tôi đang sử dụng một máy.

+0

Đây có phải là lỗi từ trình liên kết hoặc trình biên dịch không? Bạn có làm sạch tất cả các tệp đối tượng trước khi biên dịch lại không? – philant

+1

Vâng đó là một lỗi từ trình biên dịch và có tôi làm sạch tất cả các đối tượng và tôi vẫn nhận được lỗi tương tự. Cảm ơn bạn. – Eduardo

+0

Câu hỏi liên quan http://stackoverflow.com/questions/1250608/passing-a-gcc-flag-through-makefile Đã kiểm tra trước khi đăng bài của tôi. –

Trả lời

9

Tôi đã gặp sự cố này khá lâu và nếu tôi nhớ chính xác, bản sửa lỗi đã di chuyển vị trí của -fPIC ngay sau gcc trong dòng lệnh. Thực hiện hoàn toàn không có ý nghĩa, và ít hơn như vậy bây giờ, nhưng như tôi nhớ, mà cố định nó.

+1

điều này đã làm việc cho tôi. .. thêm -fPIC trực tiếp sau gcc trong Makefile tức là CC = gcc -pthread -fPIC – ashishsony

+0

Tôi gặp phải cùng một vấn đề. di chuyển "-fPIC" trực tiếp sau "gcc" (như bạn đã viết) cũng làm việc cho tôi. Khó hiểu. – cmo

+0

Các lá cờ khác mà bạn đã sử dụng với 'gcc' là gì? @ashishsony ví dụ của bạn không hiển thị '-fPIC' trực tiếp sau' gcc'. – icedwater

4

Tôi gặp phải vấn đề tương tự, nhưng nó có thêm một twist. Câu trả lời bởi @clintm giải quyết nó, nhưng tôi nghĩ tôi sẽ mô tả sự thay đổi của tôi về vấn đề ở đây để tham khảo trong tương lai ...

Makefile trên máy tính 32-bit:

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

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

này được biên soạn một cách chính xác. Nhưng cùng một Makefile thất bại khi tôi thử nó trên một máy 64-bit. Tôi đã thay đổi "-fpic" thành "-fPIC" và nó vẫn không thành công. Tôi đã thay đổi quy tắc đối tượng thành:

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

và nó vẫn không thành công.

Cuối cùng, tôi đặt "-fPIC" trong biến trình biên dịch thực tế (vì vậy mà bây giờ "-fPIC" xuất hiện trong quy tắc cho từng đối tượng các quy tắc cho các thư viện chia sẻ):

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) 

Va no đa hoạt động!

0

nếu dự án bạn muốn biên dịch có cấu hình kịch bản sử dụng đúng như thế này:

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

nên lá cờ sẽ được tất cả quy tắc của Makefile ...

vài ngày trước khi i' đã cần một ver lớn tuổi. của VLC để biên dịch trên một máy x64, nó có một cấu hình kịch bản đẹp ;-)

0

Hãy nói rằng bạn có một số makefile như:

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

TARGET = libmyawesomelib.a 

all: $(TARGET) main 

chỉ cần thêm cờ -fPIC như vậy:

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

v.v. với phần còn lại của makefile.

0

Tôi gặp sự cố này khi biên dịch chéo với chuỗi công cụ android-ndk. Tôi đã kết thúc phải sử dụng

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

Cả -fPIC cũng không -fPIE làm việc cho tôi trong tình huống này.