编译一些简单的c ++代码时出错
我尝试在osx狮子上编译这个cpp代码,但是我得到一个错误。
#include <iostream> using namespace std; int main (int argc, char *argv[]) { for(int i = 0; i < 10; i++) { cout << "hi"; cout << endl; } return 0; }
编译:
cc main.cpp
错误:
Undefined symbols for architecture x86_64: "std::cout", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from: _main in ccBdbc76.o "std::ios_base::Init::Init()", referenced from: __static_initialization_and_destruction_0(int, int)in ccBdbc76.o "std::ios_base::Init::~Init()", referenced from: ___tcf_0 in ccBdbc76.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status
通常,这种失败发生在通过调用C前端来编译C ++代码时。 您执行的gcc
可以理解和编译文件为C ++,但不会将其与C ++库链接。 例:
$ gcc example.cpp Undefined symbols for architecture x86_64: "std::cout", referenced from: _main in ccLTUBHJ.o "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: _main in ccLTUBHJ.o "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: _main in ccLTUBHJ.o "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from: _main in ccLTUBHJ.o "std::ios_base::Init::Init()", referenced from: __static_initialization_and_destruction_0(int, int)in ccLTUBHJ.o "std::ios_base::Init::~Init()", referenced from: ___tcf_0 in ccLTUBHJ.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status $ g++ example.cpp $
正如你所看到的,使用g++
会让问题消失。 如果你使用clang
(我推荐)会发生同样的行为(带有稍微不同的消息):
$ clang example.cpp Undefined symbols for architecture x86_64: "std::ios_base::Init::~Init()", referenced from: ___cxx_global_var_init in cc-IeV9O1.o "std::ios_base::Init::Init()", referenced from: ___cxx_global_var_init in cc-IeV9O1.o "std::cout", referenced from: _main in cc-IeV9O1.o "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: _main in cc-IeV9O1.o "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: _main in cc-IeV9O1.o "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from: _main in cc-IeV9O1.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) $ clang++ example.cpp $
正如你在clang
错误信息中看到的那样,你可以使用-v
来查看链接器的调用,看看有什么问题。 它会告诉你这个链接:
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a
或者类似的东西 – 正如你所看到的,它是链接C运行时,而不是C ++,也没有C ++库。 使用clang++
的连接线是:
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-wJwxjP.o /usr/lib/libstdc++.6.dylib -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a
正如你所看到的,包含libstdc++
,并且presto – 没有链接错误。
尝试
g++ main.cpp
这样它应该工作,至less使用OS X
我不熟悉OSX LION。 但是,从最严格的意义上讲,所描述的错误不是由编译器引起的,而是由链接器引起的。 看起来好像标准库没有被链接。
使用CC命令(大写)编译C ++并链接到标准C ++库。
从优胜美地(10.10.1)开始,我发现带有-lc++
标志的gcc
也可以工作:
gcc -lc++ main.cpp
以下是在macOs Sierra上运行的解决scheme:
在OS X上有两种标准C ++库的实现:libstdc ++和libc ++。 它们不是二进制兼容的,libMLi3需要libstdc ++。
在10.8和更早版本中,默认情况下selectlibstdc ++,在10.9上默认selectlibc ++。 为了确保与libMLi3的兼容性,我们需要手动selectlibstdc ++。
为此,请将-stdlib = libstdc ++添加到链接命令。
在Windows(MinGW)或Linux上是GCC吗? 在MinGW上,您需要参数-lmingw32 -enable-auto-import
。 Linux可能需要类似的东西, -enable-auto-import
是最可能需要的。
如果在OS X上使用clang,请尝试:
clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out