看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) CentOS 6 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) devtoolset-2的gcc 問題(Question): CentOS 6系統預設的gcc版本是4.4.7,過於老舊,許多c++11 feature都不支援 為了使用比較新的功能,所以我安裝了devtoolset devtoolset-2的gcc版本是4.8.2 當我利用devtoolset來編譯一些4.4.7無法編譯,但是4.8.2可以編譯的code之後 (例如 std::regex_match 在 4.4.7 不支援) 發現編譯出來的執行檔連結到的仍然是系統預設的lib # /opt/rh/devtoolset-2/root/usr/bin/g++ --std=c++11 test.cpp -o test # ldd test linux-gate.so.1 => (0x003ce000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00ea7000) libm.so.6 => /lib/libm.so.6 (0x0047f000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x002ca000) libc.so.6 => /lib/libc.so.6 (0x009f4000) /lib/ld-linux.so.2 (0x00331000) 例如可以看到連結到的是 /usr/lib/libstdc++.so.6 而不是 /opt/rh/devtoolset-2/(中略)/libstdc++.so 而事實上這樣編譯出來的程式還是可以正常執行並得到預期的輸出 讓我覺得很疑惑 難道gcc不需要搭配相應版本的libstdc++.so嗎? 是因為我使用到的c++11 feature只會在編譯階段做掉,跟連結無關嗎? 所有的c++11 feature都是如此嗎? 還是只是我挑到不會出錯的例子? 程式碼(Code): 直接用cplusplus裡面的範例程式來測試 http://www.cplusplus.com/reference/regex/regex_match/ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.65.124 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1529551713.A.E45.html
shadow0326: 後來想了一下,應該是有static link到.a檔 06/21 14:38
sarafciel: 所有的template都是在編譯期生成真正的code 06/21 15:04
sarafciel: 反過來說 template除非有做特化 不然不會編在.so裡面 06/21 15:04
sarafciel: 回到std::regex_match,它實際上是template function 06/21 15:07
sarafciel: 所以libstdc++並不包含它的實作(實際上也沒辦法) 06/21 15:08
sarafciel: 而它的code是寫在regex.h跟regex.tcc裡面 06/21 15:10
sarafciel: 所以應該是你用到的feature在編譯階段做掉了 06/21 15:12
sarafciel: 如果要測沒換++11會炸掉的情況 我記得std::thread可以 06/21 15:14
shadow0326: 我懂了,非常感謝,剛試了std::thread的確會seg fault 06/21 15:23