我需要链接哪些库才能在clang ++中使用std :: list?

时间:2014-03-31 22:41:56

标签: c++ list linker clang std

我正在尝试在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版本:

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)

2 个答案:

答案 0 :(得分:2)

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

clang++ listTest.cpp -lstdc++

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

答案 1 :(得分:2)

我解决了它(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中的那个。