2011-09-01 23 views
8

Tôi đã có một số mã C99 hoàn toàn đáng yêu được tổng hợp từ nhiều file .c, và khi tôi biên dịch với Clang 2.7, tôi nhận được một số lỗi rất lạ:Làm thế nào để ngăn chặn Clang từ các chức năng sao chép trong các tập tin tiêu đề C tiêu chuẩn?

/usr/include/bits/stdio.h:77: multiple definition of `putchar' 
a2test.o:/usr/include/bits/stdio.h:77: first defined here 

gì đang xảy ra là tiêu đề libc GNU tệp cho <stdio.h> tuyên bố một số chức năng nhất định, bao gồm putchar, là extern __inline__ và vì một số lý do, hãy đặt các định nghĩa vào các tệp .o. Sau đó, khi trình liên kết nhìn thấy các định nghĩa trùng lặp, nó sẽ nhấp nháy.

Tôi nghi ngờ có vấn đề về cấu hình: khi tôi sử dụng bản sao 2.7 đi kèm với Debian lenny, mọi thứ biên dịch. Nhưng đối với lớp tôi đang dạy, phần mềm phải chạy trên Red Hat Enterprise Linux 5, và sysadmin của tôi đã tạo ra bản sao 2.7 từ nguồn. (Chúng tôi không sử dụng 2.9 bởi vì chúng tôi không thể làm cho nó biên dịch hello world, và chúng tôi không sử dụng phiên bản mới hơn vì chúng tôi không thể tải phiên bản mới nhất.)

Tôi đang tìm cách giải quyết điều đó sẽ cho phép tôi biên dịch. Hoặc là một tùy chọn dòng lệnh hoặc một cách để cấu hình lại clang để nó không làm điều xấu này.

Tôi đã thử -U__USE_EXTERN_INLINES không có hiệu lực.

Trả lời

6

LLVM bug 5960 cho thấy vấn đề này là kết quả từ sự tương tác giữa hỗ trợ C99 của clang và phiên bản cũ của libc GNU được cài đặt trên RHEL 5. Có vẻ như đối với những người trong chúng ta bị mắc kẹt với RHEL 5, không thể sử dụng clang -std=c99 -Ox cho bất kỳ x > 0.

4

Try -std = gnu89; không thực sự lý tưởng, nhưng phải đủ tốt để giải quyết.

+0

Biên dịch mã, nhưng cảnh báo phun ở mọi nơi. Vì toàn bộ điểm sử dụng clang thay vì gcc là để nhận được thông báo lỗi tốt hơn, nó tiến triển theo một hướng khác. Cảm ơn bạn đã cố gắng. –

+0

+1 vì nó cung cấp cho tôi giải pháp cho các tệp nguồn 5 C trong phần mềm của chúng tôi. – Shirkrin

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