linux下g++编译C++工程demo与g++命令简述

目录

一、编译简单C++工程demo

1、分步编译

 2、直接生成目标文件

二、编译库

1、编译静态库.a

2、编译动态库

三、g++编译命令简述

1、编译过程

2、编译参数

(1) -I ./    指的是头文件地址     

(2)-L /    指的是库文件地址

(3)生成带有调试信息的文件

(4) 打印所有警告

(5)将所有警告当作编译错误

附加知识:


一、编译简单C++工程demo

本文编写的工程如下:

Myclass的头文件.h/
#pragma once
#include <iostream>
using namespace std;
class Myclass {
public:
	Myclass();
	~Myclass();

	void MyPrint();
};
//
///Myclass的源文件cpp///
#include "Myclass.h"
Myclass::Myclass()
{

}
Myclass::~Myclass()
{

}
void Myclass::MyPrint()
{
	std::cout << "hello This is sub print" << endl;
}
//

///数据管理文件DataMange.h
#pragma once
#include <iostream>
using namespace std;
class DataMange {
public:
	DataMange();
	~DataMange();

	void DataMangePrint();
};
///
///数据管理文件DataMange.cpp
#include "DataMange.h"

DataMange::DataMange()
{
}

DataMange::~DataMange()
{
}

void DataMange::DataMangePrint()
{
	std::cout << endl;
	std::cout << "hello This is sub2 print" << endl;
	for (int i=0; i < 5;i++)
	{
		std::cout << "DataMangePrint " << i << std::endl;
	}
}
///

///工程文件入口test1.cpp
#include <iostream>
#include "Myclass.h"
int main()
{
	std::cout << "hello word" << std::endl;

	Myclass obj;
	obj.MyPrint();
	return 0;
}

将上述代码拷贝到linux系统下,linux下的目录结构体如下:

9c81e4c583414339b7ffad9a1f4191c4.png

上面的DataManage文件夹下面有DataMange.h和DataMange.cpp

编译有分步编译和直接编译。

1、分步编译

(1)生成.o文件,执行指令如下:

/Public/test1$ g++ -c ./Myclass.cpp ./DataManage/DataMange.cpp ./test1.cpp -I ./ -I ./DataManage/
生成的文件如下:

f7664b00fbdb47cfb534e4b42d37bfa5.png

 (2)生成可执行目标文件.out

指令如下:

g++ ./Myclass.o ./DataMange.o ./test1.o -I ./ -I ./DataMange/ -o main
生成的文件如下:

fdd4719e75c44fcbb962e80341046b77.png

(3)直接运行目标文件,输入命令:./main 

结果如下:

f48fd94a7601440889f99a43aed6ad47.png

 2、直接生成目标文件

(1)直接生成目标执行文件.out,输入如下命令:

g++  ./Myclass.cpp ./DataManage/DataMange.cpp ./test1.cpp -I ./ -I ./DataManage/ -o main

 (2)直接运行目标文件。

二、编译库

1、编译静态库.a

编译DataManage文件下的类函数为静态库.a

 (1)生成.o文件

输入命令:g++ -c ./DataManage/DataMange.cpp -I ./DataManage/

(2)生成libDataMange.a文件

输入命令:ar crv libDataMange.a DataMange.o 

(3)运用.a文件

链接静态库.a生成可执行文件main,

g++ -o main  Myclass.cpp  test1.cpp  -L ./  libDataMange.a

或者输入命令:

g++ Myclass.cpp  test1.cpp  -L ./  libDataMange.a -o main

上述的执行过程的如下:

2、编译动态库

 (1)生成DataManage的动态库.so
输入命令:g++ -fPIC -shared -o libData.so ./DataManage/DataMange.cpp -I ./DataManage/

(2)使用动态库,生成可执行文件

输入命令:g++ -o main Myclass.cpp -I.  test1.cpp -L.  ./libData.so

或者输入命令:g++ -o main Myclass.cpp -I.  test1.cpp   ./libData.so

(3)查看动态库是否正确链接到库,输入命令:ldd main

(4)运行,输入命令:./main

上述的执行过程如下:

三、g++编译命令简述

1、编译过程

g++是GNU的c++编译器,在执行编译代码时,对应4个编译过程:

(1)预处理(完成代码中的宏替换,查找相关库文件)生存.i文件,对应编译参数-E。

                eg: g++ -E main.cpp

(2)编译(将预处理后文件转换成汇编语言).s文件,对应编译参数-S。

                eg:g++ -S main.cpp        //直接生成.s汇编文件

                eg:g++ -S main.i                //将预处理产生的i文件编译生成.s文件 

(3)汇编(将汇编语言文件转换成目标代码,即机器代码).o文件,对应编译参数-c

                eg:g++ -c main.cpp

(4)链接(链接目标代码或静态库、动态库等[连接器ld])生成可执行程序,对应编译参数-o

               eg:g++ main.o -o main

2、编译参数

(1) -I ./    指的是头文件地址     
(2)-L /    指的是库文件地址

关于g++编译时的地址符号可参考:linux 下 g++编译程序时,-I(大写i) 与-L(大写l)-l(小写l) 的作用_lin_008的博客-CSDN博客_linux 动态编译-l的作用

(3)生成带有调试信息的文件

      eg:g++ -g main.cpp -o main      //直接生成输出文件,-g1,-g2,-g3,g3生成的文件调试信息最多,                                                          //默认g2

关于g++的编译参数可参考Linux下,g++的常用编译参数,调试信息,优化,指定库,头文件目录,库目录,警告信息处理,编译标准,输出名称,宏,多文件的编译_优秀的邓宗磊的博客-CSDN博客_g++ 编译指定头文件

编译参数也可参考:

g++编译过程和动态链接库_weixin_34080903的博客-CSDN博客

(4) 打印所有警告

  参数: -Wall ,允许发出GCC能够提供的所有有用的警告

demo程序如下:

#include <iostream>
using namespace std;
int nGlobal = 0;
int Recursive(int n1)
{
    if (n1 == 1)
    {
        return 1;

    }
   int tmp = n1;
   return Recursive(n1-1)*n1;

}

class A
{
public:
    A(int var1,int var2):b(var1),a(var2){};
    int a;
    int b;
};//成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关

int main()
{
    Recursive(6);
    return 0;
}

 

 

(5)将所有警告当作编译错误

参数:-Werror, 把所有警告转换为错误,以在警告发生时中止编译过程,注意需要先设置 -Wall。

 

附加知识:

编译过程详细介绍可参考:

10分钟搞懂g++编译过程_至绽至强的博客-CSDN博客_g++编译

编译静态库和动态库也可参考上面的链接。

编译参考可参考:

GCC/G++详细使用手册_编译(告警、优化、调试选项)_gc++_mw_nice的博客-CSDN博客

gcc/g++编译参数详解_IM魂影的博客-CSDN博客

类成员初始化顺序问题参考:

C++类成员初始化顺序问题_c++ 成员常量 为什么不能在构造函数收纳柜初始化_青雲-吾道乐途的博客-CSDN博客

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux下,可以使用GCC编译器(GNU Compiler Collection)来编译C++程序。首先需要确认是否已在系统中安装了GCC,可以在终端中输入命令g++ -v”来检查是否已安装。如果没有安装,则需要使用包管理器进行安装。安装完成后,在终端中使用命令g++ 文件名.cpp -o 输出文件名”来编译C++程序,其中文件名.cpp为要编译的源代码文件名,输出文件名为可执行文件的名称。编译完成后,可进入终端中运行可执行文件来测试程序。 ### 回答2: 在Linux系统中编译C工程需要经过以下步骤: 1. 安装C编译器 在Linux中默认可能未安装C编译器,需要先安装GCC等编译器,可以打开终端输入以下命令进行安装,比如在Ubuntu和Debian中可以使用apt-get命令安装: sudo apt-get install build-essential 该命令会安装C编译器和构建工具包。 2. 创建Makefile文件 Makefile是用来编译C源代码的一个构建文件,通常包含编译器选项、编译文件列表和依赖关系等信息。可以使用文本编辑器创建Makefile文件,命名为Makefile。 3. 编写C语言源代码 在创建Makefile文件之前,需要先编写C源文件。可以使用任何文本编辑器,比如vim、gedit等打开一个空文件,将C源代码写入文件并保存。 4. 编写Makefile文件 Makefile文件的格式是特定的,其中包含了如何编译和链接项目中所有的源代码文件。在Makefile文件中,需要提供每个源文件的文件名和目标文件的名称。编译器选项,如编译标志和库路径也需要在Makefile文件中指定。 一个简单的Makefile文件可能如下所示: CC=gcc CFLAGS=-std=c99 -Wall -Wextra LDFLAGS=-lm SRC=main.c foo.c bar.c OBJ=$(SRC:.c=.o) EXEC=myprogram all: $(EXEC) $(EXEC): $(OBJ) $(CC) $(LDFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -o $@ -c $< clean: rm -f $(EXEC) $(OBJ) 5. 编译项目 在终端进入到项目目录下,并运行make命令。Make会查找Makefile文件并按照其中指定的规则编译和链接项目源代码。 make 完成编译后,会在当前目录下生成可执行程序文件。可以使用以下命令运行程序: ./myprogram 在Linux系统中编译C工程需要这些步骤,诸如修改源代码和调试程序,也需要学习。 ### 回答3: 在 Linux 系统下编译 C 项目可以使用 GCC 编译器。GCC 是 GNU Compiler Collection 的缩写,是一套由 GNU 开发的编程语言编译器。GCC 编译器在 Linux 系统中的使用非常广泛,特别是在 C 编程方面。 以下是一个简单的编译 C 项目的步骤: 1. 打开终端并切换到项目的根目录。 2. 使用文本编辑器打开 Makefile 文件,Makefile 文件是一个文本文件,包含有关包含在项目中的文件及其之间的依赖关系的信息。 3. 确认 Makefile 文件中包含所有项目的源代码文件。 4. 确认 Makefile 文件中包含 GCC 编译器的路径和编译器标志。 5. 使用 GCC 编译器将源代码编译成可执行文件。在终端中输入以下命令:``` $ make ``` 6. 如果没有编译错误,将在根目录下创建可执行文件,使用以下命令运行可执行文件: ``` $ ./executable_file ``` 7. 如果需要重新编译项目,请使用清除命令将所有的项目文件和可执行文件删除,并执行步骤 5 重新编译项目: ``` $ make clean $ make ``` 以上是一个简单的编译 C 项目的步骤。当然,不同的项目需要使用不同的编译器标志和编译选项。在编写 Makefile 文件时,请参考 GCC 编译器和所使用的库的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值