Eclipse CDT与llvm的libc ++编译错误在ubuntu下?

时间:2014-01-19 05:29:10

标签: eclipse-cdt llvm-clang libc++

我可以在命令行中编译和运行c ++示例,如下所示:

clang++ -std=c++11 -stdlib=libc++ Test.cpp

但是当在eclipse中尝试这个时,我得到了这些错误

12:58:18 **** Incremental Build of configuration Debug for project C++Test ****
Info: Internal Builder is used for build

clang++ -L/usr/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/ -o
C++Test src/C++Test.bc -llibc++ -lstdc++ 

/usr/bin/ld: cannot find -llibc++

clang: error: linker command failed with exit code 1 (use -v to see invocation)

这里有两件奇怪的事情:

首先,我实际上在项目构建设置中附加了“-std = c ++ 11 -stdlib = libc ++”来编译命令,但它似乎被忽略了。为什么?

其次,我从链接库中删除了stdc ++,但每次都会自动添加它,如下所示:

更新:添加图片以演示此问题 stdc++ will be added automatically again after deleting

然后,我尝试从项目设置中的链接库中删除libc ++,再次编译,得到 像这样的一堆错误:

Info: Internal Builder is used for build
clang++ -L/usr/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/ -o C++Test src/C++Test.bc -lstdc++ 
/tmp/C++Test-d24e4c.o: In function `main':
/home/alex/workspace/C++Test/Debug/../src/C++Test.cpp:12: undefined reference to `std::__1::cout'
/tmp/C++Test-d24e4c.o: In function `std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*)':
/usr/include/c++/v1/ostream:974: undefined reference to `std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)'
/tmp/C++Test-d24e4c.o: In function `std::__1::basic_ios<char, std::__1::char_traits<char> >::fill() const':
/usr/include/c++/v1/ios:734: undefined reference to `std::__1::ios_base::getloc() const'
......

“ - std = c ++ 11 -stdlib = libc ++”仍被忽略,那么如何让它工作?

1 个答案:

答案 0 :(得分:2)

最重要的问题是链接器找不到libc++

的原因

如果要将动态库(例如libfoo.so)与-l标记相关联, 您使用-lfoo选项,而不是-llibfoo。因此要链接libc++ 您使用选项-lc++,而不是-llibc++,就像您所做的那样。在你的 项目的图书馆(-l)设置,将libc++替换为c++

第二个问题是Eclipse-CDT生成的链接命令:

clang++ -L/usr/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/ -o
C++Test src/C++Test.bc -llibc++ -lstdc++

正在尝试链接libstdc++(GCC标准C ++库)以及 (应该是什么)libc++(LLVM标准C ++库)。你想要 链接一个或另一个,而不是两者:

你说即使你从项目的库中删除了stdc++,也是如此 由Eclipse构建自动添加。我不能重现那个问题。 也许你可以仔细检查一下:

  • 从项目库中删除stdc++并应用该更改。

  • 然后查看链接器设置 - &gt; 所有选项,看看是否-lstdc++ 出现在那里。它不应该。

  • 如果是,请查看链接器设置 - &gt; 其他 - &gt; 链接标记其他选项-lstdc++出现在那里吗?如果是,请将其删除。

  • 否则,请查看链接器的专家设置:命令行模式。 如果它包含-lstdc++,请将其删除。

您还说您已附加选项-std=c++11 -stdlib=libc++ 编译器命令设置,但这似乎被忽略了。他们可能是 似乎被忽略,因为只有项目的链接步骤失败,所以 构建时不会重新运行编译步骤。但是它被误导了 将这些选项添加到编译命令: -

  • -std=c++11编译选项。您应该将其添加到 编译器 - &gt; 其他 - &gt; 其他标志

  • -stdlib=libc++是一个链接选项,如果需要,应该是 添加到 链接器 - &gt; 其他 - &gt; 链接标记。不过它 如果您还与-lc++链接,则使用此选项是多余的(不要 链接-lstdc++),-lc++是更可靠的选项。我建议你 不要打扰-stdlib=libc++

鉴于您与libc++的关联困难,应该问:你 真的需要吗?你用clang建造这个事实并没有让你失望 链接libc++。 Clang很乐意链接libstdc++