如何在Ubuntu Linux下编译C ++?

时间:2009-11-08 12:49:19

标签: c++ gcc

我将以下代码从a previous question剪切并粘贴到名为“avishay.cpp”的文件中,然后运行

gcc avishay.cpp

仅从链接器获取以下错误消息。出了什么问题,我该怎么做?

carl@carl-ubuntu:~/Projects/StackOverflow$ gcc -static avishay.cpp 
/tmp/cccRNW34.o: In function `__static_initialization_and_destruction_0(int, int)':
avishay.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::Init()'
avishay.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()'
/tmp/cccRNW34.o: In function `A::func()':
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x11): undefined reference to `std::cout'
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x16): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x1e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x26): undefined reference to `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> >&))'
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x36): undefined reference to `std::cout'
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x3b): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
/tmp/cccRNW34.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

C ++代码(不是我的代码,我只是试图运行它):

#include <iostream>
using namespace std;

class A
{
private:
   int _dmember;

public:
   void func()
   {
     cout<<"Inside A!! "<<endl;
     cout<<_dmember; // crash when reach here.
   }
};

int main ()

{

    A* a= NULL;

    a->func(); // prints "Inside A!!!" 

    return 1;
}

11 个答案:

答案 0 :(得分:69)

您应该使用g++而不是gcc来编译C ++程序。

对于这个特定的节目,我只是输入

make avishay

make弄明白其余部分。为您的可执行文件提供一个不错的名称,而不是a.out

答案 1 :(得分:11)

你可能应该使用g ++而不是gcc。

答案 2 :(得分:9)

是的,使用g ++进行编译。它将自动添加libstdc ++的所有引用,这些引用是链接程序所必需的。

g++ source.cpp -o source

如果省略-o参数,则生成的可执行文件将命名为a.out。在任何情况下,都已设置了可执行权限,因此无需chmod任何内容。

此外,代码将为您提供未定义的行为(可能还有SIGSEGV),因为您正在取消引用NULL指针并尝试在不存在的对象上调用成员函数,因此它肯定不会打印任何内容。它可能会崩溃或做一些时髦的舞蹈。

答案 3 :(得分:5)

更新你的apt-get:

$ sudo apt-get update
$ sudo apt-get install g++

运行program.cpp:

$ g++ program.cpp
$ ./a.out

答案 4 :(得分:4)

g ++是linux下的C ++编译器。代码看起来正确。您可能缺少使用的库引用:

g ++ -l {库名在这里(数学fns使用“m”)} codefile.cpp

答案 5 :(得分:4)

使用

  

克++

空格后跟程序名称。 e.g:

  

g++ prog.cpp

如果在这种情况下文件名为“prog.cpp”。 如果你想运行程序写:

./prog

所以我用了

  

“PROG”

因为这是我的文件名。

答案 6 :(得分:4)

即使你可以通过gcc编译你的c ++代码 听起来好笑?是的。 试试吧

$  gcc avishay.cpp -lstdc++

享受

答案 7 :(得分:2)

使用g ++。并确保安装了相关的库。

答案 8 :(得分:1)

你可以使用g ++ --std = c ++ 0x example.cpp -o example

答案 9 :(得分:1)

要编译.sidebar { width: calc(50% - 160px); height: 100vh; position: absolute; margin-top: 76px; right: 0; margin: 0; top: 0; margin-right: -100%; box-sizing: border-box; padding: 30px 80px 60px; z-index: 3; overflow-y: scroll; background: black; -webkit-transition: margin-right 1.2s ease; transition: margin-right 1.2s ease; } ,请运行

- (void) URLSession:(NSURLSession *)session dataTask:    (NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {

completionHandler(NSURLSessionResponseAllow);
}

此命令将source.cpp编译到同一目录中的文件g++ source.cpp 。 要运行已编译的文件,请运行

source.cpp

如果使用a.out编译其他源文件,则新编译的文件./a.out 将覆盖使用g++ source2.cpp生成的a.out

如果要将a.out编译为特定文件,请说source.cpp, 跑

source.cpp

compiledfile

这将创建g++ source.cpp -o compiledfile ,它是已编译的二进制文件。运行g++ -o compiledfile source.cpp ,运行

compiledfile

如果compiledfile中没有./compiledfile ,请将g ++替换为g++

答案 10 :(得分:0)

安装gcc并尝试下面的视频 试试这个:
https://www.youtube.com/watch?v=A6v2Ceqy4Tk
希望它对你有用。