2011-09-23 109 views
37

我尝试在osx狮子上编译这个cpp代码,但出现错误。编译一些简单的C++代码时出错

#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 
+4

这是一个链接器问题。你如何链接? –

+0

我是新来的CPP,我不太了解你的问题。 : –

+3

你用什么指令编译和链接?什么编译器? –

回答

76

通常,这种失败发生在通过调用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 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看到链接器调用看:如果你使用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-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++包括,和急 - 没有链接错误。

+10

+1推荐叮铛声。 – 2011-09-23 18:39:36

+2

使用clang ++工作。 –

+2

哎呀!我忘了将我的'other.c'文件添加到'clang'命令文件名参数中。我刚刚做了'clang main.c'。做'clang main.c other.c'工作。 (我在'main.c'的顶部有'#include“other.h”' – ma11hew28

3

我不熟悉的OSX狮子。但是,从最严格的意义上讲,所描述的错误不是由编译器引起的,而是由链接器引起的。看起来好像标准库没有被链接。

3

使用CC命令(大写)编译C++并链接到标准C++库。

0

这是在Windows(MinGW)或Linux上的GCC?在MinGW上,您需要参数-lmingw32 -enable-auto-import。 Linux可能需要类似的东西,-enable-auto-import是最有可能需要的。

+0

OP的问题是'osx lion'。 –

+0

显然我无法阅读-_- – Frigo

5

尝试

g++ main.cpp 

这样,它应该工作,至少使用OS X

1

约塞米蒂(10.10.1)中,我发现,gcc-lc++标志也适用:

gcc -lc++ main.cpp 
0

如果使用OS X上铛,尝试:

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out 
1

以下是可用于macOs Sierra的解决方案:

在OS X上有两种可用的标准C++库实现:libstdC++和libC++。它们不是二进制兼容的,libMLi3需要libstdC++。

10。8和更早版本的libstdC++是默认选择的,在10.9上默认选择libC++。为了确保与libMLi3的兼容性,我们需要手动选择libstdC++。

为此,请将-stdlib = libstdC++添加到链接命令。