作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1529551713.A.E45.html
1F:→ shadow0326: 後来想了一下,应该是有static link到.a档 06/21 14:38
2F:→ sarafciel: 所有的template都是在编译期生成真正的code 06/21 15:04
3F:→ sarafciel: 反过来说 template除非有做特化 不然不会编在.so里面 06/21 15:04
4F:→ sarafciel: 回到std::regex_match,它实际上是template function 06/21 15:07
5F:→ sarafciel: 所以libstdc++并不包含它的实作(实际上也没办法) 06/21 15:08
6F:→ sarafciel: 而它的code是写在regex.h跟regex.tcc里面 06/21 15:10
7F:→ sarafciel: 所以应该是你用到的feature在编译阶段做掉了 06/21 15:12
8F:→ sarafciel: 如果要测没换++11会炸掉的情况 我记得std::thread可以 06/21 15:14
9F:→ shadow0326: 我懂了,非常感谢,刚试了std::thread的确会seg fault 06/21 15:23