作者shadow0326 (非議)
看板C_and_CPP
標題[問題] devtoolset linking問題
時間Thu Jun 21 11:28:29 2018
開發平台(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