gpt4 book ai didi

c++ - 如何在 GCC 5 中处理双 ABI?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:29 27 4
gpt4 key购买 nike

我试图了解如何解决 GCC 5 中引入的双 ABI 的问题。但是,我没能做到。这是一个非常简单的重现错误的例子。我使用的 GCC 版本是 5.2。如您所见,我的主要功能(在 main.cpp 文件中)非常简单:

// main.cpp

#include <iostream>
#include <string>

int main()
{
std::string message = "SUCCESS!";
std::cout << message << std::endl;
}

当我打字时

/home/aleph/gcc/5.2.0/bin/g++ main.cpp

我收到以下错误消息:

/tmp/ccjsTADd.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
main.cpp:(.text+0x43): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
main.cpp:(.text+0x5c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
main.cpp:(.text+0x8c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
collect2: erreur: ld a retourné 1 code d'état d'exécution

如果我将 _GLIBCXX_USE_CXX11_ABI 的值更改为 0,问题就会消失。

但是,如何让默认的 ABI 工作呢?

编辑:更简单的问题(删除了 cmake 脚本)

最佳答案

我通过向 gcc(-v 标志)添加更多详细信息找到了解决方案。如果您有同样的问题,您需要告诉 gcc 在包含您的发行版 libstdc++ 版本的存储库中搜索库。换句话说,你应该尝试这样的事情:

/home/aleph/gcc/5.2.0/bin/g++ -L /home/aleph/gcc/5.2.0/lib64 main.cpp

之后应该正确执行链接步骤。但是,您可能无法运行您的程序。进入

./a.out

可能会导致以下错误:

./a.out: relocation error: ./a.out: symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

实际上,您可以通过键入来检查您的可执行文件是否依赖于错误版本的 libstdc++

ldd a.out

这应该会导致类似的结果:

linux-vdso.so.1 =>  (0x00007ffebb722000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000003a71400000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x0000003d03a00000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x0000003a71000000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000003d02e00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d02a00000)

将 LD_LIBRARY_PATH 设置为您自己的 libstdc++ 版本的路径将解决问题:

LD_LIBRARY_PATH=/home/aleph/gcc/5.2.0/lib64 ./a.out

希望对您有所帮助!

编辑:正如 Marc 所注意到的,可以修改 rpath,而不是修改环境变量 LD_LIBRARY_PATH。这是执行此操作的 CMake 配置脚本。

project (example CXX)

add_executable(main main.cpp)

if(GCC_ROOT)
set(CMAKE_CXX_COMPILER ${GCC_ROOT}/bin/g++)
target_link_libraries(main ${GCC_ROOT}/lib64/libstdc++.so)
link_directories(${GCC_ROOT}/lib64)
endif(GCC_ROOT)

这个脚本可以和通常的组合一起使用

cmake ..
make

在“构建”子目录中。但也可以通过提供 GCC 发行版根目录的路径来选择我们自己的编译器:

cmake -D GCC_ROOT=/home/aleph/gcc/5.2.0 ..
make

脚本的编写使得 libstdc++ 的版本对应于输入 GCC 发行版的版本。

关于c++ - 如何在 GCC 5 中处理双 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33500337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com