原文地址:http://wiki.ubuntu.org.cn/Compiling_Cpp
https://www.cnblogs.com/battlescars/p/cpp_linux_gcc.html
https://blog.csdn.net/stpeace/article/details/73302833
"undefined reference to" 问题汇总及解决方法 ------非常非常好的一篇文章
https://blog.csdn.net/stpeace/article/details/73302833C++编程中相关文件后缀
1.单个源文件生成可执行程序
下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码:
/* helloworld.cpp */
#include <iostream>
int main(int argc,char *argv[])
{
std::cout << "hello, world" << std::endl;
return(0);
}
程序使用定义在头文件
iostream
中的
cout
,向标准输出写入一个简单的字符串。该代码可用以下命令编译为可执行文件:
$ g++ helloworld.cpp
编译器
g++
通过检查命令行中指定的文件的后缀名可识别其为
C++
源代码文件。编译器默认的动作:编译源代码文件生成对象文件
(object file)
,链接对象文件和
libstdc++
库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的
a.out
。程序可以这样来运行:
$ ./a.out
hello, world
更普遍的做法是通过 -o 选项指定可执行程序的文件名。下面的命令将产生名为 helloworld 的可执行文件:
$ g++ helloworld.cpp -o helloworld
在命令行中输入程序名可使之运行:
$ ./helloworld
hello, world
程序
g++
是将
gcc
默认语言设为
C++
的一个特殊的版本,链接时它自动使用
C++
标准库而不用
C
标准库。通过遵循源码的命名规范并指定对应库的名字,用
gcc
来编译链接
C++
程序是可行的,如下例所示:
$ gcc helloworld.cpp -lstdc++ -o helloworld
选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。
在大多数系统中,GCC 安装时会安装一名为 c++ 的程序。如果被安装,它和 g++ 是等同,如下例所示,用法也一致:
$ c++ helloworld.cpp -o helloworld
2.多个源文件生成可执行程序
如果多于一个的源码文件在 g++ 命令中指定,它们都将被编译并被链接成一个单一的可执行文件。下面是一个名为 speak.h 的头文件;它包含一个仅含有一个函数的类的定义:
/* speak.h */
#include <iostream>
class Speak
{
public:
void sayHello(const char *);
};
下面列出的是文件
speak.cpp
的内容:包含
sayHello()
函数的函数体:
/* speak.cpp */
#include "speak.h"
void Speak::sayHello(const char *str)
{
std::cout << "Hello " << str << "\n";
}
文件 hellospeak.cpp 内是一个使用 Speak 类的程序:
/* hellospeak.cpp */
#include "speak.h"
int main(int argc,char *argv[])
{
Speak speak;
speak.sayHello("world");
return(0);
}
下面这条命令将上述两个源码文件编译链接成一个单一的可执行程序:
$ g++ hellospeak.cpp speak.cpp -o hellospeak
PS
:这里说一下为什么在命令中没有提到
“speak.h“
该文件(原因是:在
“speak.cpp“
中包含有
”#include"speak.h"“
这句代码,它的意思是搜索系统头文件目录之前将先在当前目录中搜索文件
“speak.h“
。而
”speak.h“
正在该目录中,不用再在命令中指定了)。