उस स्थिति पर विचार करें जब एक C++ प्रोजेक्ट बनाया जाता है और एक Centos 7 वर्चुअल मशीन या कंटेनर के भीतर भेज दिया जाता है। Centos 7 के लिए डिफ़ॉल्ट gcc 4.8 है। डेवलपर्स को आधुनिक C++ का उपयोग करने की अनुमति देने के लिए, gcc (उदाहरण के लिए, 6.3) का नवीनतम संस्करण Centos 7 में स्थापित किया गया है जो CI सर्वर के रूप में चलता है। यह -std=c++14 सहायता प्रदान करता है।

[builder@f7279ae9f33f build (master %)]$ /usr/bin/c++ -v 2>&1 | grep version
gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
[builder@f7279ae9f33f build (master %)]$ /opt/rh/devtoolset-6/root/usr/bin/c++  -v 2>&1 | grep version
gcc version 6.3.1 20170216 (Red Hat 6.3.1-3) (GCC) 
export CXX=/opt/rh/devtoolset-6/root/usr/bin/c++
make all -j4
...

यह संकलन और लिंकेज कमांड का संक्षिप्त उदाहरण है:

[ 78%] Building CXX object CMakeFiles/ucsdos.dir/src/merge_operator_string.cpp.o
/opt/rh/devtoolset-6/root/usr/bin/c++  -Ducsdos_EXPORTS -I/home/builder/src/dos/libucsdos/./src -I/home/builder/src/dos/libucsdos/./include -I/home/builder/src/dos/libucsdos/build/schema/cpp -I/home/builder/src/dos/libucsdos/build/schema -isystem /usr/local/include  -O2 -g -DNDEBUG -fPIC   -frtti -pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused -std=gnu++14 -o CMakeFiles/ucsdos.dir/src/merge_operator_string.cpp.o -c /home/builder/src/dos/libucsdos/src/merge_operator_string.cpp

[ 80%] Linking CXX shared library libucsdos.so
/usr/bin/cmake3 -E cmake_link_script CMakeFiles/ucsdos.dir/link.txt --verbose=1
/opt/rh/devtoolset-6/root/usr/bin/c++ -fPIC -O2 -g -DNDEBUG  -shared -Wl,-soname,libucsdos.so.0 -o libucsdos.so.0.3.23 CMakeFiles/ucsdos.dir/src/c.cpp.o CMakeFiles/ucsdos.dir/src/crdt_2p_set.cpp.o CMakeFiles/ucsdos.dir/src/crdt_pn_counter.cpp.o CMakeFiles/ucsdos.dir/src/errors.cpp.o CMakeFiles/ucsdos.dir/src/merge_index_document.cpp.o CMakeFiles/ucsdos.dir/src/merge_index_segment.cpp.o CMakeFiles/ucsdos.dir/src/merge_operator_string.cpp.o -Wl,-rpath,/usr/local/lib: schema/libschema.a /usr/lib64/librocksdb.so /usr/lib64/libjemalloc.so /usr/local/lib/libgrpc++_reflection.so /usr/local/lib/libgrpc++.so /usr/local/lib/libgrpc.so -ldl -lgrpc++ /usr/lib64/libprotobuf.so -lpthread /usr/lib64/libprotobuf-lite.so 

वैसे भी, परिणामी कलाकृतियां libstdc++ के सिस्टम डिफ़ॉल्ट संस्करण से जुड़ी हुई प्रतीत होती हैं:

[builder@f7279ae9f33f build (master %)]$ ldd libucsdos.so | grep libstdc++.so.6
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f2a4a054000)

यह पता लगाना आसान है कि /lib64/libstdc++.so.6 संस्करण 4.8.5 है:

[builder@f7279ae9f33f build (master %)]$ yum whatprovides "/lib64/libstdc++.so.6"
libstdc++-4.8.5-28.el7_5.1.x86_64 : GNU Standard C++ Library
Repo        : @Updates
Matched from:
Filename    : /lib64/libstdc++.so.6

क्या यह बिल्ड पर्यावरण कॉन्फ़िगरेशन मान्य है?

9
Vitaly Isaev 2 अक्टूबर 2018, 16:22

1 उत्तर

सबसे बढ़िया उत्तर

वैसे भी, परिणामी कलाकृतियों को libstdc++ के सिस्टम डिफ़ॉल्ट संस्करण के साथ जोड़ा गया प्रतीत होता है:

हाँ। devtoolset-6-gcc-c++ पैकेज जीसीसी का एक कस्टम संस्करण प्रदान करता है जो libstdc++.so के लिए एक गतिशील पुस्तकालय के बजाय एक विशेष लिंकर स्क्रिप्ट का उपयोग करता है। इसका अर्थ है कि इसके द्वारा उत्पन्न बायनेरिज़ नए libstdc++.so.6 पर निर्भर नहीं हैं और अन्य CentOS मशीनों पर चलाए जा सकते हैं जिनमें devtoolset स्थापित नहीं है (अर्थात उनके पास GCC 4.8 से केवल पुरानी libstdc++ लाइब्रेरी है)।

क्या यह बिल्ड पर्यावरण कॉन्फ़िगरेशन मान्य है?

हां। आप जो देख रहे हैं वह पूरी तरह से सामान्य है, और इसे कैसे काम करना चाहिए।

जीसीसी 6.4.0 से नए सी ++ रनटाइम के टुकड़े आपके बाइनरी में स्थिर रूप से जुड़े हुए हैं, और रनटाइम पर यह केवल पुराने libstdc++.so पर निर्भर करता है जिसे प्रत्येक सेंटोस सिस्टम ने स्थापित किया है।

यह GCC के devtoolset संस्करण का संपूर्ण बिंदु है।

11
Jonathan Wakely 2 अक्टूबर 2018, 15:16