我可以在命令行中编译和运行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 ++,但每次都会自动添加它,如下所示:
更新:添加图片以演示此问题
然后,我尝试从项目设置中的链接库中删除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 ++”仍被忽略,那么如何让它工作?
答案 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++
。