Articles of libstdc ++

在Linux上编译一个共享库来定位所有发行版

我们想要创build一个共享库(.so)来定位所有的发行版,包括旧发行版。 代码是用C ++编写的,使用C ++ 11的特性,所以编译器必须至less是gcc 4.7。 我们注意到,如果我们在安装了gcc 4.7.2的Linux机器上编译我们的代码(例如,Ubuntu 12.10),那么.so生成的版本为“版本1(GNU / Linux)”,而在旧的操作系统上(例如CentOS 5.6)版本是“版本1(SYSV)” – GNU / Linux较新版本的库不能在旧的操作系统上使用。 所以我们尝试了在CentOS 5.6机器上安装gcc 4.7的方法,用这个编译器编译我们的代码,并且用libstdc ++(-static-libstdc ++)静态链接 – 这样就产生了一个.so,在我们发现的每个linux上都可以使用。 这对32位工作正常。 但是,当我们在64位操作系统(CentOS)上遵循相同的方法时,这个失败的错误是我们试图链接的现有libstdc ++。a编译时没有使用-fPIC。 所以我们试着用“-with-pic”选项来编译gcc 4.7.2源代码,但是我们不能链接到新的libstdc ++。a – 错误是: /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:/usr/local/lib/libFoo.so:版本节点找不到符号_ZNSs7_M_copyEPcPKcm @ GLIBCXX_3。 4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:未设置dynamic区段大小:错误值collect2:错误:ld返回1退出状态 我们search了编译libstdc ++与-fPIC可能会有问题,但为什么它适用于32位而不是64位的操作系统? 是否有另一种build议的方式来创build一个.so所有的Linux发行版?

链接/运行时不同GCC版本的风险?

我使用的是英特尔的C ++编译器,它在Linux上依赖于GNU提供的libc.so和libstdc ++。 这是我的问题。 要访问一些最新的C ++ 11function,我需要使用GCC 4.7或更高版本附带的libstdc ++。 但我坚持使用CentOS 6.4。 在CentOS 6.4上,GCC的本地版本是4.4。 但是使用名为“SCL”的RedHat和名为“devtoolset-1.1”的软件包,我可以在“/ opt”下安装GCC 4.7。 我以上述方式设置了使用GCC 4.7,我可以使用更新的C ++ 11function。 所以这里是我的问题:如果用户运行我的程序只有libc.so / libstdc ++的GCC 4.4版本,所以在库path中,是否有风险,我的程序将有错误,由于4.4和4.7版本之间的不匹配那些图书馆? 如果有潜在的问题,我可以通过在GCC 4.7的libc和libstdc ++版本中静态链接来解决这个问题吗? 或者,如果/当我的代码dynamic加载的其他库select由系统范围的GCC 4.4包提供的较旧的libc / libstdc ++时,是否设置自己的其他问题?

/usr/lib64/libstdc++.so.6:未find版本`GLIBCXX_3.4.15'

我正在尝试运行appiumtesting。 但是我得到错误说什么: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found 我正在使用RedHat6.6。 当我运行: strings /usr/lib/libstdc++.so.6 | grep GLIBC 我得到这个: GLIBC GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBC_2.0 GLIBC_2.3 GLIBC_2.4 GLIBC_2.1 GLIBC_2.1.3 GLIBC_2.3.2 GLIBC_2.2 GLIBCXX_FORCE_NEW GLIBCXX_DEBUG_MESSAGE_LENGTH 是否有可能为RedHat6.6获得GLIBCXX_3.4.15?

强制或防止使用特定的次要版本的libstdc ++

为了使用C ++ 11和c ++ 14的特性,我有一个使用新版本的gcc(4.9.1)编译的应用程序,因此是一个更新版本的libstdc ++。 该应用程序由许多小程序组成,因此我将libstdc ++作为共享库而不是静态链接(即,我不希望使用-static-libstdc ++) 我希望将新版本的libstdc ++与/ opt / lib64下的应用程序一起发货(注意:在GPL的例外情况下,这是特别允许的) libstdc ++。的新版本与目标平台上的版本只有次版本不同。 libstdc ++被devise为向前兼容,以便现有的程序可以使用新版本的库。 但是,当一些程序使用新版本而不是旧版本时,我观察到行为(即错误)的细微差别。 我希望阻止这一点。 我还发现ld会尝试将我的应用程序与系统版本的libstdc ++连接起来,除非我在LD_LIBRARY_PATH中早先放置/ opt / lib64。 假设你可以使用-l:<library>.<version>强制链接一个特定的版本,但是,这似乎不工作。 我怀疑它会为用户创build的库,但不是像libstd ++语言运行时库,因为gcc本身生成链接器脚本。 在我的一个目标平台(RHEL5)上,甚至没有被gcc / ld理解。 我认为这是可能的,通过使用-nostdlib并链接到我的构build系统中的所有要求(例如-lgcc),而不是把它留给我更喜欢的gcc。 到目前为止,我还没有尝试过。 一个简单的解决方法是确保LD_LIBRARY_PATH包含/ opt / lib64,当我运行我的应用程序,而不是其他方式或同样我可以使用LD_PRELOAD与正确的库版本。 这个问题,如果有人决定不理会我的意见和运行 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/<vendor>/lib64 它可能导致微妙和难以诊断问题。 所以我一直在寻找更好的方法。 我想知道是否有某种方法可以将libstdc ++重命名为lib_stdc ++,并将其与该soname进行链接。 重命名libstdc ++是不够的,因为你需要改变readelf给出的文件中的soname。 即 0x000000000000000e (SONAME) Library soname: [libstdc++.so.6] 如果你在一个正常的程序上使用-l:stdc++.so.6.0.20这个事情,那么你会发现这个主要版本并不是特定的次要版本。 即 […]

将g ++ 4.8链接到libstdc ++

我在桌面上下载并构build了gcc 4.8.1,运行64位Ubuntu 12.04。 我build立它的源头,如文档build议,并与命令 ../../gcc-4.8.1/configure –prefix=$HOME –program-suffix=-4.8 make make -k check make install 它似乎通过了所有的testing,我把所有的东西都安装到我的主目录(后缀为-4.8),以便与系统gcc(版本4.6.3)区分开来。 不幸的是,当我使用g ++ – 4.8编译c ++程序时,它链接到系统libc和libstdc ++,而不是从gcc-4.8.1编译的新程序。 我下载并构build了gcc 4.8,因为我想在标准库中使用新的C ++ 11function,所以这种行为绝对不是我想要的。 我能做些什么来让gcc-4.8自动链接到它附带的标准库,而不是系统标准库?

是正则expression式的gcc 4.8或更早的车?

我正在尝试在C ++ 11代码中使用std :: regex,但看起来支持是有点bug。 一个例子: #include <regex> #include <iostream> int main (int argc, const char * argv[]) { std::regex r("st|mt|tr"); std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl; std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl; std::cerr << "st|mt|tr" << " matches tr? " […]