我需要链接什么库才能在 clang++ 中使用 std::list

What library do I need to link to use std::list in clang++?

本文关键字:clang++ std list 链接 什么      更新时间:2023-10-16

我正在尝试在C++中使用std::list类,我需要使用clang++来编译程序。 g++ 编译以下程序很好,但我无法弄清楚如何使用 clang++ 编译/链接它:

#include <iostream>
#include <list>
int main(){
  std::list<int> L;
  L.push_back(10);
  std::cout << L.back() << std::endl;
  return 0;
} 

我已经尝试clang++ -lstdc++ listTest.cpp但仍然收到以下错误:

/tmp/listTest-3175a9.o: In function `std::list<int, std::allocator<int> >::_M_insert(std::_List_iterator<int>, int const&)':
listTest.cpp:(.text._ZNSt4listIiSaIiEE9_M_insertESt14_List_iteratorIiERKi[_ZNSt4listIiSaIiEE9_M_insertESt14_List_iteratorIiERKi]+0x31): undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

叮当版:

clang version 3.4 (tags/RELEASE_34/final)

Linux版本:

LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Red Hat Enterprise Linux Server release 6.5 (Santiago)

您应该在使用它们的翻译单元之后提供库参数:

clang++ listTest.cpp -lstdc++

应该指出,我无法重现您的问题,但这很容易归结为版本/配置的差异(特别是默认情况下选择使用的 stdlib 实现)。

我在我的上面解决了它(redhat,clang 3.4,gcc 4.7.2)。

默认情况下,此项目与/usr/lib/libstdc++链接。 我有一个单独的位置安装了 gcc 4.7.2 的版本;当我在链接步骤中添加类似于以下内容的行时,它工作正常

-L${GCC_PATH}/lib -Wl,-R${GCC_PATH}/lib

。前提是它们出现在链接步骤中,在 /usr/lib 的类似语句之前。


编辑

您可以使用strace来帮助诊断此问题;我做了如下操作:

// copy the link step into a temp shell script
strace -f ./temp.sh |& grep -P 'lib(std)?c++'

。这时我意识到我可能需要一个不同的 C++ 运行时版本,因为我看到它正在查找并链接到 /usr/lib 中的那个。