2015-06-02 9 views
10

29.5 परमाणु प्रकार सी ++ स्टैंडर्ड नवंबर 2014 काम मसौदा की में यह कहा गया है:क्यों जी ++ अभी भी आवश्यकता होती है -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 ]

तो - जहाँ तक मैं बता सकता हूँ के रूप में - यह:

#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(); 
} 

पूरी तरह मान्य मानक सी ++ 14 (और सी ++ 11) कोड होना चाहिए। हालांकि, अगर मैं मैन्युअल libatomic लिंक नहीं करते, आदेश

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

देता है - कम से कम फेडोरा 22 (जीसीसी 5.1) पर - निम्नलिखित जोड़ने त्रुटि:

/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 

अगर मैं लिखना

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

सबकुछ ठीक है। मुझे पता है कि मानक कंपाइलर झंडे या पुस्तकालयों के बारे में कुछ भी नहीं कहता है, लेकिन अब तक मैंने सोचा था कि किसी भी मानक अनुरूप, एकल फ़ाइल कोड को पहले कमांड के माध्यम से संकलित किया जा सकता है।

तो यह मेरे उदाहरण कोड पर क्यों लागू नहीं होता है? क्या कोई तर्कसंगत है कि -latomic अभी भी जरूरी है, या यह ऐसा कुछ है जिसे संकलक रखरखावकर्ताओं द्वारा संबोधित नहीं किया गया है, फिर भी?

उत्तर

4

Relevant reading जीसीसी होमपेज पर कैसे और क्यों जीसीसी कुछ मामलों में लाइब्रेरी कॉल करता है <atomic> पहले स्थान पर।

जीसीसी और libstdC++ केवल संक्षेप में युग्मित हैं। libatomic लाइब्रेरी का डोमेन है, संकलक नहीं - और आप एक अलग पुस्तकालय के साथ जीसीसी का उपयोग कर सकते हैं (जो <atomic> के लिए अपने मुख्य उचित, या एक अलग नाम के तहत आवश्यक परिभाषाएं प्रदान कर सकता है), इसलिए जीसीसी केवल नहीं मान सकता-latomic

Also:

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

एक ही पृष्ठ का दावा है कि जीसीसी 4.8 इस तरह के एक पुस्तकालय कार्यान्वयन प्रदान करेगा, लेकिन योजनाओं युद्ध के पहले शिकार होते हैं। मुझे लगता है कि -latomic का कारण अभी भी जरूरी है कि आसपास के इलाके में पाया जा सके।

इसके अलावा ...

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

... -lm काफी कुछ समय के लिए चारों ओर हो गया है यदि आप गणित कार्यों उपयोग कर रहे हैं।

+2

ध्यान दें कि सी ++ मानक कुछ हद तक संदिग्ध है कि पुस्तकालय एक अलग घटक है - लाइब्रेरी अनुभाग काफी स्टैंडअलोन हैं, लेकिन मानक में "कार्यान्वयन" का अर्थ संकलक और पुस्तकालय का संयोजन है। – MSalters

+1

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन जीसीसी करता है - डिफ़ॉल्ट रूप से - कुछ पुस्तकालयों को शामिल करें, तो डिफ़ॉल्ट '-latomic' अलग कैसे होगा? – MikeMB

+0

@MSalters: हाँ, लेकिन जीसीसी के मामले में, "कार्यान्वयन" का अर्थ है "जीसीसी और कुछ संगत मानक पुस्तकालय"। यही वह है जिसे मैं इंगित करना चाहता था - कंपाइलर और उसके (एन) मानक पुस्तकालयों के * एक * के बीच एक अभी तक अंतिम रूप से एपीआई नहीं है, और आप संकलक लोगों से अलग '-latomic' प्राप्त करते हैं जो इसे नहीं सोचते मैथ कोड के लिए '-lm' की आवश्यकता के लिए सभी समस्याग्रस्त हैं। चारों ओर कोई बड़ा सौदा नहीं। – DevSolar

0

g++gcc के लिए एक रैपर है जो सही सी ++ पुस्तकालय जोड़ता है। स्पष्ट रूप से -latomic उस सूची से गायब है। कोर कंपाइलर समस्या नहीं तो, रैपर में बस एक मामूली बग।

+0

यह एक सचेत निर्णय हो सकता है क्योंकि यह अभी तक पूरी तरह लागू नहीं हुआ है। विशेष रूप से * 2 9 .3 आदेश और स्थिरता * समर्थन आंशिक के रूप में सूचीबद्ध है। https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014 –

+4

'g ++' _ got' के लिए एक रैपर 'g ++ '_not_" है। वे भाई बहनों की तरह अधिक हैं, दोनों विभिन्न वास्तविक कंपाइलर्स को लपेटते हैं (उदा। 'सीसी 1 प्लस')। –

1

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

दाएं।

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

अच्छा, नहीं। जैसा कि आप बस ने कहा, यह मानने का कोई विशेष कारण नहीं है।यह भी विचार करें कि डिफ़ॉल्ट रूप से जीसीसी एक्सटेंशन सक्षम हैं।

कहा जा रहा है, ऐसा लगता है कि यह स्पष्ट है कि इरादा -latomic रनटाइम का एक डिफ़ॉल्ट भाग बनाना है जब यह थोड़ा सा हो गया है।

+0

स्पष्ट रूप से मैंने मानक में लिखी गई किसी भी चीज़ के आधार पर यह धारणा नहीं बनाई, लेकिन जी ++ के साथ मेरे (कुछ हद तक सीमित) अनुभव के आधार पर। अगर मैं गलत हूं तो मुझे भी सही करें, लेकिन '-std = C++ 11' g ++ विशिष्ट एक्सटेंशन अक्षम नहीं करता है? – MikeMB

+0

@MikeMB: ओह, यह हो सकता है। –

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