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

29

我从之前的一个问题中复制粘贴了下面的代码到名为"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;
}

重复的问题:https://dev59.com/aXVC5IYBdhLWcg3wtzqs - Jonathan Wakely
11个回答

71

编译C++程序时应该使用g++而不是gcc

对于这个特定的程序,我只是输入了

make avishay

并让 make 处理其余部分。这还会为您的可执行文件提供一个体面的名称,而不是 a.out


5
如果可以的话,再加一个赞(+1)给“make”的提示。我从未想到过"make"能够做到那样的事情! - Carl Smotricz
这里的“make”是如何工作的?我尝试了“make serial-rob.c”,但它显示“没有要做的事情”。 - user59634
2
我认为诀窍在于让它使用其隐式规则。如果它像对我一样有效,那么“make serial-rob”(不带 .c)应该可以做到。 - Carl Smotricz
4
"make serial-rob.c"无法运行的原因是该文件已经被创建了,已经存在。另一方面,当make寻找名为serial-rob的文件时,它不存在,但它有一个隐含规则可将*.c制作成*.o,然后再制作为*。 - SingleNegationElimination

12

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


7
谢谢。就在昨天我还不知道如何拼写“C++程序员”,而今天我已经成为了一名! - Carl Smotricz

9

是的,使用g++进行编译。它会自动添加所有必要的libstdc++引用以链接程序。

g++ source.cpp -o source

如果省略-o参数,则结果可执行文件将被命名为a.out。无论如何,可执行权限已经设置好,因此不需要chmod任何内容。
此外,由于您正在取消引用空指针并尝试在不存在的对象上调用成员函数,因此代码将给出未定义的行为(并可能导致SIGSEGV),因此它肯定不会打印任何内容。它可能会崩溃或做一些有趣的舞蹈。

是的,这段代码是另一个问题的一部分(已链接),并在那里受到了应有的抨击。对于快速测试,我不介意将程序命名为a.out,而我也知道-o选项。我的主要问题是关于编译器名称的,谢谢! - Carl Smotricz

7

更新你的apt-get:

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

运行你的program.cpp程序:

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

在其他答案中,这个更加清晰明了。非常感谢。 - Akash Kandpal

4

使用

g++

加上空格后跟程序名。 例如:

g++ prog.cpp

如果文件名是"prog.cpp",在这种情况下。 如果要运行程序,请写:

./prog

因为我的文件名是“prog”,所以我使用了

"prog"


1
输出文件将是 "a.out",除非您使用 "-o" 标志。 - Kookerus

4

g++是Linux下的C++编译器。代码看起来没问题。有可能你缺少一个库引用,使用方法如下:

g++ -l{库名称(数学函数使用“m”)} codefile.cpp


4

即使是使用gcc编译你的c++代码也可以实现。 听起来很有趣吧?没错。 试一试吧。

$  gcc avishay.cpp -lstdc++

享受


2

使用g++编译。确保您已安装相关库。


我为Ubuntu付了不少钱...哦等等,我没有!但是没错,问题就在于我调用编译器的方式。 - Carl Smotricz

1

要编译source.cpp,运行以下命令:

g++ source.cpp

这条命令将会把source.cpp编译成同目录下的a.out文件。 要运行编译后的文件,请运行
./a.out

如果您使用g++ source2.cpp编译另一个源文件,新编译的文件a.out将覆盖使用source.cpp生成的a.out
如果您想将source.cpp编译到特定文件(例如compiledfile),请运行:
g++ source.cpp -o compiledfile

或者

g++ -o compiledfile source.cpp

这将创建编译后的二进制文件compiledfile。要运行compiledfile,请运行。
./compiledfile

如果您的 $PATH 中没有 g++,请将 g++ 替换为 /usr/bin/g++

1
你可以使用 g++ --std=c++0x example.cpp -o example 来编译代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接