2015-06-02 21 views
10

Trong 29,5 loại Atomic của C++ chuẩn Tháng Mười Một dự thảo năm 2014 làm việc nó khẳng định:Tại sao g ++ vẫn đòi hỏi -latomic

  1. There is a generic class template atomic. The type of the template argument T shall be trivially copyable (3.9). [ Note: Type arguments that are not also statically initializable may be difficult to use. —end note ]

Vì vậy, - như xa như tôi có thể nói - điều này:

#include <atomic> 

struct Message { 
    unsigned long int a; 
    unsigned long int b; 
}; 

std::atomic<Message> sharedState; 

int main() {  
    Message tmp{1,2};  
    sharedState.store(tmp);   
    Message tmp2=sharedState.load(); 
} 

phải là tiêu chuẩn hoàn toàn hợp lệ C++ 14 (và cũng C++ 11) mã. Tuy nhiên, nếu tôi không liên kết libatomic bằng tay, lệnh

g++ -std=c++14 <filename> 

cho - ít nhất là trên Fedora 22 (gcc 5.1) - lỗi liên kết sau đây:

/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)': 
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16' 
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const': 
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16' 
collect2: error: ld returned 1 exit status 

Nếu tôi viết

g++ -std=c++14 -latomic <filename> 

mọi thứ đều ổn. Tôi biết rằng tiêu chuẩn không nói gì về cờ biên dịch hoặc thư viện phải được bao gồm, nhưng cho đến nay tôi nghĩ rằng bất kỳ sự phù hợp tiêu chuẩn nào, mã tệp đơn lẻ đều có thể được biên dịch thông qua lệnh đầu tiên.

Vậy tại sao điều đó không áp dụng cho mã ví dụ của tôi? Có một lý do hợp lý tại sao -latomic vẫn còn cần thiết, hoặc là nó chỉ là một cái gì đó đã không được giải quyết bởi các nhà duy trì trình biên dịch, chưa?

Trả lời

4

Relevant reading trên trang chủ GCC về cách thức và lý do tại sao GCC làm cho các cuộc gọi thư viện trong một số trường hợp liên quan đến <atomic> ở nơi đầu tiên.

GCC và libstdC++ chỉ được ghép đôi. libatomic là miền của thư viện, không phải trình biên dịch - và bạn có thể sử dụng GCC với một thư viện khác (có thể cung cấp các định nghĩa cần thiết cho <atomic> trong tên chính của nó hoặc dưới tên khác), vì vậy GCC không thể chỉ giả sử-latomic.

Also:

GCC 4.7 does not include a library implementation as the API has not been firmly established.

Trang cùng tuyên bố rằng GCC 4.8 sẽ cung cấp như một thực hiện thư viện, nhưng kế hoạch là những nạn nhân đầu tiên của chiến tranh. Tôi đoán lý do cho -latomic vẫn cần thiết có thể được tìm thấy trong vùng lân cận đó.

Bên cạnh đó ...

...so far I thought that any standard conformant, single file code can be compiled via the first command.

... -lm đã được khoảng một thời gian khá lâu nếu bạn đang sử dụng chức năng toán học.

+2

Lưu ý rằng C++ Standard hơi mơ hồ cho dù thư viện là một thành phần riêng biệt - các phần thư viện khá độc lập, nhưng "việc thực hiện" trong chuẩn nghĩa là sự kết hợp của trình biên dịch và thư viện. – MSalters

+1

Sửa tôi nếu tôi sai, nhưng gcc KHÔNG - theo mặc định - bao gồm một vài thư viện, vậy làm thế nào một '-latomic' mặc định sẽ khác? – MikeMB

+0

@MSalters: Có, nhưng trong trường hợp của GCC, "việc thực hiện" có nghĩa là "GCC và một số thư viện chuẩn tương thích". Đó là những gì tôi muốn chỉ ra - một API chưa hoàn thiện giữa trình biên dịch và * một * của các thư viện chuẩn (n) của nó, và bạn nhận được một '-latomic' riêng biệt từ những người biên dịch mà không nghĩ rằng nó tất cả đều có vấn đề khi yêu cầu '-lm' cho mã toán học. Không có vấn đề lớn, tất cả xung quanh. – DevSolar

0

g++ là trình bao bọc cho gcc để thêm các thư viện C++ chính xác. Rõ ràng -latomic bị thiếu trong danh sách đó. Không phải là một vấn đề trình biên dịch lõi sau đó, chỉ cần một lỗi nhỏ trong wrapper.

+0

Nó cũng có thể là một quyết định có ý thức vì nó chưa được triển khai đầy đủ. Đặc biệt * 29.3 Hỗ trợ đặt hàng và nhất quán * được liệt kê dưới dạng một phần. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014 –

+4

'g ++' là _not_ "một trình bao bọc cho' gcc' ". Chúng giống như anh chị em ruột, cả hai gói các trình biên dịch thực tế khác nhau (ví dụ: 'cc1plus'). –

1

I know that the standard doesn't say anything about compiler flags or libraries that have to be included

Phải.

but so far I thought that any standard conformant, single file code can be compiled via the first command.

Vâng, không. Khi bạn chỉ cho biết, không có lý do cụ thể nào để giả định điều này.Cũng nên xem xét rằng các mở rộng GCC được kích hoạt theo mặc định.

Điều đó đang được nói, có vẻ như hiển nhiên rằng ý định là làm cho -latomic một phần mặc định của thời gian chạy khi nó được giải quyết một chút.

+0

Rõ ràng là tôi đã không đưa ra giả định đó dựa trên bất cứ điều gì được viết trong tiêu chuẩn, nhưng dựa trên kinh nghiệm của tôi (hơi hạn chế) với g ++. Ngoài ra sửa tôi nếu tôi sai, nhưng không '-std = C++ 11' vô hiệu hóa g + + mở rộng cụ thể? – MikeMB

+0

@MikeMB: Ồ, có thể. –

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