2012-06-20 26 views
23

Tôi porting một ứng dụng từ Solaris sang Linuxcrt1.o: Trong chức năng '_start ': - tài liệu tham khảo không xác định cho `chính' trong Linux

Các tập tin đối tượng được liên kết không có một main() xác định. Nhưng biên dịch và liên kết được thực hiện đúng cách trong Solaris và thực thi được tạo ra. Trong Linux, tôi nhận được lỗi này

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 

Vấn đề của tôi là, tôi không thể đưa tệp mới .c/.o kể từ khi ứng dụng lớn và chạy trong nhiều năm. Làm thế nào tôi có thể loại bỏ lỗi này?

extractes Mã của makefile:

RPCAPPN = api 
LINK = cc 

    $(RPCAPPN)_server: $(RPCAPIOBJ) 
      $(LINK) -g $(RPCAPIOBJ) -o $(RPCAPPN)_server $(IDALIBS) $(LIBS) $(ORALIBS) $(COMMONLIB) $(LIBAPI) $(CCLIB) $(THREADLIB) $(DBSERVERLIB) $(ENCLIB) 
+0

Bạn có thể đăng các makefile và/hoặc các lệnh xây dựng thực tế không? –

+0

Có .. Tôi đã thêm vài dòng từ makefile. – Blackforest

+0

Đơn giản: bạn ngừng gọi chính hoặc bạn xác định chính (^) Tại sao nó hoạt động trên solaris? Nó có cờ liên kết đặc biệt không (liên kết đến đối tượng được chia sẻ?) – wildplasser

Trả lời

23

Hãy thử thêm -nostartfiles để lựa chọn mối liên kết của bạn, ví dụ:

$(LINK) -nostartfiles -g ... 

Từ gcc documentation:

-nostartfiles 
    Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used. 

Điều này gây crt1.o không được liên kết (nó thường được liên kết theo mặc định) - thường chỉ được sử dụng khi bạn triển khai mã _start của riêng mình.

+3

tùy thuộc vào vấn đề, sau đó điều này không thực sự là giải pháp - tôi có vấn đề tương tự khi cố gắng thực hiện dự án thử nghiệm tăng cường và thêm cờ này làm mọi thứ tồi tệ hơn – serup

13

tùy chọn liên kết -shared phải nối thêm khi bạn tuân thủ một cái

+2

Điều này thực sự đã giúp tôi cài đặt gói R trước đó không thành công với lỗi ở trên. – Thomas

+0

Đồng ý; điều này cũng giúp tôi giải quyết vấn đề với việc biên dịch các hàm bên ngoài cho sqlite. – gregory

1

Tôi có kết quả tương tự khi cố gắng xây dựng một dự án thử nghiệm mới với đẩy mạnh, và nó bật ra rằng tôi đang thiếu một tuyên bố:

#define BOOST_TEST_MODULE <yourtestName> 
0

Đối với tôi, lỗi này xuất hiện khi sử dụng các ký tự UTF-8 thô trong chuỗi ký tự. ARM7HL, Hệ điều hành Sailfish, GNU C++.

Các vấn đề liên quan