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

Car*_*icz 28 c++ gcc

我将上一个问题中的以下代码剪切并粘贴到名为"avishay.cpp"的文件中,然后运行

gcc avishay.cpp
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 70

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

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

make avishay
Run Code Online (Sandbox Code Playgroud)

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

  • 另外+1(如果可以的话)为"制造"提示.我从来不知道make会/会那样做! (5认同)
  • `make serial-rob.c`不起作用的原因是因为该文件已经制作,它已经存在了.另一方面,当make查找名为serial-rob的文件时,它不在那里,但是它有一个隐含的规则,可以将*.c转换为*.o,并将其转换为* (4认同)
  • 我认为,诀窍是让它使用其隐含的规则.如果它对你有用,就像它对我一样,那么"make serial-rob"(没有.c)应该这样做. (2认同)

jac*_*bit 12

您可能应该使用g ++而不是gcc.

  • 谢谢.就在昨天,我不知道如何拼写"C++程序员",今天我就是一个! (7认同)

blw*_*y10 9

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

g++ source.cpp -o source
Run Code Online (Sandbox Code Playgroud)

如果省略该-o参数,则会生成结果可执行文件a.out.无论如何,已经设置了可执行权限,因此不需要chmod任何操作.

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


小智 5

更新你的apt-get:

$ sudo apt-get update
$ sudo apt-get install g++
Run Code Online (Sandbox Code Playgroud)

运行你的program.cpp:

$ g++ program.cpp
$ ./a.out
Run Code Online (Sandbox Code Playgroud)