我正在尝试在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)
答案 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
中的那个。