单个文件:
g++ file.cpp
这是最简单形式,缺省输出为a.out,可以用-o命令指定输出文件,比如g++ file.cpp f.out
多个文件:
g++ -c 1.cpp -o 1.o
g++ -c 2.cpp -o 2.o
g++ 1.o 2.o -o prog.out
链接成可执行文件:
一般用g++ -o file file.cpp
多个文件是g++ -o file file1.cpp file2.cpp
编译C++不是用GCC而是G++.
如果用GCC能编译但不能链接.
多个文件:
1.编译多个文件,但不连接:
g++ file1.cpp file2.cpp
会生成两个文件:file1.o, file2.o
2.连接:
g++ -o outFileName file1.o file2.o
会生成一个可执行文件:outFileName。
❷ C++编译时,是从哪一个cpp开始的,然后各cpp的编译顺序是如何定的
编译顺序由你在编译设置里决定
其实编译顺序并不重要
最终的连接过程是产生可执行文件的最终步骤,只要保证连接时所有的目标文件都存在就行了
比如一个小程序包括两个文件
//main.cpp
extern int a;
int main(void){
printf("%d\n",a);
a=5;
printf("%d\n",a);
}
//var.cpp
int a=2;
----
gcc -c main.cpp
gcc -c var.cpp//这两步可以换过来
gcc main.o var.o//这两个参数也可以换过来
输出
2
5
❸ 多个cpp文件如何一起编译
将函数的声明放到头文件,函数的定义放在cpp文件,之后再主函数中,将头文件包含进来,进行联编
❹ vs2010如何编译单个CPP文件。
可以明确的告诉你,无此种编译器存在,编译文件不光光是看源文件,各个工程中还有很多的配置文件存在,如果不建立工程,任何编译器都是无法知道你到底是要编译控制台程序,windows程序,或者是DLL。所以还不存在。
❺ c++如何编译啊 ~
以linux系统为例:
1、在连网的情况下,在终端中使用root超级用户权限输入以下命令:
sudo apt-get install g++
并回车即可安装C++编译器g++。
2、安装完毕,即可开始新建我们的一个C++工程了。下面以一个hello工程为例,简单地介绍如何编译一个 C++工程。
3、登录Linux系统,打开终端,在当前目录下使用mkdir命令新建一个hello的目录;然后使用cd hello进入hello目录中,并使用vi工具新建hello.h、hello.cpp、main.cpp、makefile四个文件。四个文件的内容分别如下:
1. hello.h文件
#ifndef HELLO_H_
#define HELLO_H_
class Hello {
public:
void print();
};
#endif
2. hello.cpp文件
#include "hello.h"
#include <iostream>
using namespace std;
void Hello::print() {
cout<<"Hello, welcome to Redhat Linux os!"<<endl;
}
3. main.cpp文件
#include "hello.h"
#include <iostream>
using namespace std;
int main() {
Hello h;
h.print();
return 0;
}
注意:这三个文件要以空白行结束,否则编译时会有警告信息。
4. makefile文件
# this is a makefile of the c++ project hello
# the standard c++ compiler in the Redhat linux is g++
# written by young on June 27th, 2009
TARGET = .
CC = g++
CFLAGS = -g
CFLAGC = -c
MAINC = main.cpp
HELLO = hello.cpp
OBJ = hello.o
INCLUDE = -I$(TARGET)
EXEC = $(TARGET)/main
all: $(EXEC)
$(EXEC): $(OBJ) $(MAINC)
$(CC) $(CFLAGS) $(OBJ) $(MAINC) $(INCLUDE) -o $@
rm -f $(OBJ)
@echo "<<<<<< $@ is created successfully! >>>>>>"
$(OBJ): $(HELLO)
$(CC) $(CFLAGC) $(HELLO) -o $@
clean:
rm -f $(EXEC)
注意: makefile文件中的命令行(红色字体)一定要以Tab建开头,否则编译通不过。
写好makefile文件后,即可编译工程。在终端中输入make命令,回车后将显示如下信息:
g++ -c hello.cpp -o hello.o
g++ -g hello.o main.cpp -I. -o main
rm -f hello.o
<<<<<< main is created successfully! >>>>>>
这些信息说明工程已被正确编译,当前目录下将生成一个main的可执行文件。
同样,你也可以不使用makefile文件,而直接在终端上输入以下两行命令:
g++ -c hello.cpp -o hello.o
g++ -g hello.o main.cpp -I. -o main
也可以编译这个工程。
使用ls -l命令查看当前目录下的所有文件,确实有一个main文件。
在终端中输入./main,即可运行程序。
❻ 如何加快C++代码的编译速度
C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速度,却只有低调的份了。比如我现在工作的源代码,哪怕使用Incredibuild调动近百台机子,一个完整的build也需要四个小时,恐怖!!!虽然平时开发一般不需要在本地做完整的build,但编译几个相关的工程就够你等上好一段时间的了(老外管这个叫monkey around,相当形象)。想想若干年在一台单核2.8GHZ上工作时的场景 - 面前放本书,一点build按钮,就低头读一会书~~~往事不堪回首。
可以想象,如果不加以重视,编译速度极有可能会成为开发过程中的一个瓶颈。那么,为什么C++它就编译的这么慢呢?
我想最重要的一个原因应该是C++基本的"头文件-源文件"的编译模型:
每个源文件作为一个编译单元,可能会包含上百甚至上千个头文件,而在每一个编译单元,这些头文件都会被从硬盘读进来一遍,然后被解析一遍。
每个编译单元都会产生一个obj文件,然后所以这些obj文件会被link到一起,并且这个过程很难并行。
这里,问题在于无数头文件的重复load与解析,以及密集的磁盘操作。
下面从各个角度给出一些加快编译速度的做法,主要还是针对上面提出的这个关键问题。
一、代码角度
在头文件中使用前置声明,而不是直接包含头文件。
不要以为你只是多加了一个头文件,由于头文件的"被包含"特性,这种效果可能会被无限放大。所以,要尽一切可能使头文件精简。很多时候前置申明某个namespace中的类会比较痛苦,而直接include会方便很多,千万要抵制住这种诱惑;类的成员,函数参数等也尽量用引用,指针,为前置声明创造条件。
使用Pimpl模式
Pimpl全称为Private Implementation。传统的C++的类的接口与实现是混淆在一起的,而Pimpl这种做法使得类的接口与实现得以完全分离。如此,只要类的公共接口保持不变,对类实现的修改始终只需编译该cpp;同时,该类提供给外界的头文件也会精简许多。
高度模块化
模块化就是低耦合,就是尽可能的减少相互依赖。这里其实有两个层面的意思。一是文件与文件之间,一个头文件的变化,尽量不要引起其他文件的重新编译;二是工程与工程之间,对一个工程的修改,尽量不要引起太多其他工程的编译。这就要求头文件,或者工程的内容一定要单一,不要什么东西都往里面塞,从而引起不必要的依赖。这也可以说是内聚性吧。
以头文件为例,不要把两个不相关的类,或者没什么联系的宏定义放到一个头文件里。内容要尽量单一,从而不会使包含他们的文件包含了不需要的内容。记得我们曾经做过这么一个事,把代码中最"hot"的那些头文件找出来,然后分成多个独立的小文件,效果相当可观。
其实我们去年做过的refactoring,把众多DLL分离成UI与Core两个部分,也是有着相同的效果的 - 提高开发效率。
删除冗余的头文件
一些代码经过上十年的开发与维护,经手的人无数,很有可能出现包含了没用的头文件,或重复包含的现象,去掉这些冗余的include是相当必要的。当然,这主要是针对cpp的,因为对于一个头文件,其中的某个include是否冗余很难界定,得看是否在最终的编译单元中用到了,而这样又可能出现在一个编译单元用到了,而在另外一个编译单元中没用到的情况。
之前曾写过一个Perl脚本用来自动去除这些冗余的头文件,在某个工程中竟然去掉多达了5000多个的include。
特别注意inline和template
这是C++中两种比较"先进"的机制,但是它们却又强制我们在头文件中包含实现,这对增加头文件的内容,从而减慢编译速度有着很大的贡献。使用之前,权衡一下。
二、综合技巧
预编译头文件(PCH)
把一些常用但不常改动的头文件放在预编译头文件中。这样,至少在单个工程中你不需要在每个编译单元里一遍又一遍的load与解析同一个头文件了。
Unity Build
Unity Build做法很简单,把所有的cpp包含到一个cpp中(all.cpp) ,然后只编译all.cpp。这样我们就只有一个编译单元,这意味着不需要重复load与解析同一个头文件了,同时因为只产生一个obj文件,在链接的时候也不需要那么密集的磁盘操作了,估计能有10x的提高,看看这个视频感受一下其做法与速度吧。
ccache
compiler cache, 通过cache上一次编译的结果,使rebuild在保持结果相同的情况下,极大的提高速度。我们知道如果是build,系统会对比源代码与目标代码的时间来决定是否要重新编译某个文件,这个方法其实并不完全可靠(比如从svn上拿了上个版本的代码),而ccache判断的原则则是文件的内容,相对来讲要可靠的多。很可惜的是,Visual Studio现在还不支持这个功能 - 其实完全可以加一个新的命令,比如cache build,介于build与rebuild之间,这样,rebuild就可以基本不用了。
不要有太多的Additional Include Directories
编译器定位你include的头文件,是根据你提供的include directories进行搜索的。可以想象,如果你提供了100个包含目录,而某个头文件是在第100个目录下,定位它的过程是非常痛苦的。组织好你的包含目录,并尽量保持简洁。
三、编译资源
要提高速度,要么减少任务,要么加派人手,前面两个方面讲得都是减少任务,而事实上,在提高编译速度这块,加派人手还是有着非常重要的作用的。
并行编译
买个4核的,或者8核的cpu,每次一build,就是8个文件并行着编,那速度,看着都爽。 要是你们老板不同意,让他读读这篇文章:Hardware is Cheap, Programmers are Expensive
更好的磁盘
我们知道,编译速度慢很大一部分原因是磁盘操作,那么除了尽可能的减少磁盘操作,我们还可以做的就是加快磁盘速度。比如上面8个核一块工作的时候,磁盘极有可能成为最大的瓶颈。买个15000转的磁盘,或者SSD,或者RAID0的,总之,越快越好。
分布式编译
一台机子的性能始终是有限的,利用网络中空闲的cpu资源,以及专门用来编译的build server来帮助你编译才能从根本上解决我们编译速度的问题,想想原来要build 1个多小时工程的在2分钟内就能搞定,你就知道你一定不能没有它 - Incredibuild。
并行,其实还可以这么做。
这是一个比较极端的情况,如果你用了Incredibuild,对最终的编译速度还是不满意,怎么办?其实只要跳出思维的框架,编译速度还是可以有质的飞跃的 - 前提是你有足够多的机器:
假设你有solution A和solution B,B依赖于A,所以必须在A之后Build B。其中A,B Build各需要1个小时,那么总共要2个小时。可是B一定要在A之后build吗?跳出这个思维框架,你就有了下述方案:
这样,通过让A的build与B的编译并行,最后link一下B中的project,整个编译速度应该能够控制在1个小时15分钟之内。
同时开始build A和B 。
A的build成功,这里虽然B的build失败了,但都只是失败在最后的link上。
重新link B中的project。
❼ vs2013打开的cpp文件如何编译
Visual Studio无法对单个源代码文件直接编译。
VisualStudio工程(.sln)编译需要许多的参数,比如头文件源文件,依赖库等。如果没有他们,强大的Studio只是废物。
解决思路:
建立一个空VisualStudio工程->导入源代码->编译运行。
Step1 建立空项目
1.1 打开VisualStudio,按快捷键Ctrl + Shift + N,即可弹出新建项目的窗口。
(或,文件(FILE)->新建(NEW)->工程(Project)即可弹出新建项目的窗口。)
❽ linux 怎样编译cpp程序例如hello.cpp。等等,很简单的源程序文件,
说道在liunx下编译,就不得不说下Makefile了,它有个隐式规则很少人知道
比如你要编译hello.cpp
你可以通过make hello.cpp
应该没有比这个更简单的编译方法了。
在liunx下调式的话,就需要学习gdb调试方法了,这个网络一下,有很详细的教程。
最后推荐一下《跟我一起写 Makefile》这篇文章,看完你应该对linux下编译C/C++程序有很深的了解了
❾ Linux里面.cpp文件编译的问题
不是用make,是用G++,比如,你的文件名是test.cpp,所在的路径是/home/test/test.cpp
你就在终端里输入:cd /home/test
然后输入g++ -o test test.cpp
就已经生成编译好的文件了。
如果想看运行结果可以在终端输入
./test
(还是在刚才的路径下输入)