Ubuntu 用gcc/CMakefile编译器 编译、运行c语言程序

这篇具有很好参考价值的文章主要介绍了Ubuntu 用gcc/CMakefile编译器 编译、运行c语言程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一. 在Ubuntu系统下用c语言编写一个简单的输出hello world 的程序,并编译、运行。

1.1 gcc/g++简介

1.2 c++程序输出 Hello World:

1.3 c语言程序输出 Hello World:

二. 编写一个主程序文件main1.c和一个子程序文件sub1.c,实现函数间的调用

2.1  编写sub1.c 和main1.c 函数

2.1.1 编写sub1.c函数

2.1.2 编写main1.c函数,赋值a=3,b=2

2.2   将sub1.c程序封装为动态库或者静态库

​2.2.1  生成静态库

2.2.1  生成动态库

2.2.3 动态库和静态库的区别

三.  在windows下系统下用DVC++编程实现

3.1 编辑主程序

3.2 编辑子程序

 3.3 运行效果

四.  用CMakefile方式编程主程序

4.1 CMakefile 简介

4.2 创建CMakeListss.txt

4.3 在CMakeLists.txt中添加添加可执行文件,给sub1.c添加静态库,并添加链接

4.4 执行 CMakeLists.txt,并查看是否生成上述文件

4.5 分别执行连接动态库和静态库的可执行文件

五. 总结


一. 在Ubuntu系统下用c语言编写一个简单的输出hello world 的程序,并编译、运行。

1.1 gcc/g++简介

      gcc/g++都是GUN开发的编译器,前者用于对c语言程序的编译,后者用于对c++程序的编译。

其语法格式大同小异。

常用命令:

-E
    只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面。例子用法:   
    gcc -E hello.c > pianoapan.txt   
    gcc -E hello.c | more   
    慢慢看吧,一句`hello word`也要预处理成800行的代码。     
-S   
    只激活预处理和编译,就是指把文件编译成为汇编代码。例子用法: 
    gcc -S hello.c   
    将生成.s的汇编代码,可以用文本编辑器查看。    
-c    
    只激活预处理,编译,和汇编,也就是他只把程序做成obj文件。例子用法:   
    gcc -c hello.c   
    将生成.o的目标文件(object file)。 
-o
    指定目标名称,缺省的时候,gcc/g++编译出来的文件是a.out。例子如下:   
    g++ -o hello.out hello.cpp
    g++ -o hello.asm -S hello.cpp   

目录选项: 

-I[dir]
    在你是用#include "file"的时候,gcc/g++会先在当前目录查找你所指定的头文件,如果没有找到,会到系统默认的头文件目录找。如果使用-I指定了目录,编译器会先在指定的目录查找,然后再去系统默认头文件目录查找。对于#include <file>,gcc/g++会到-I指定的目录查找,查找不到,然后再到系统默认的头文件目录查找。
-include [file]
    相当于“#include”,用于包含某个代码,简单来说,就是编译某个文件,需要另一个文件的时候,就可以   
    用它设定,功能就相当于在代码中使用#include。例子用法:   
    gcc hello.c -include /root/pianopan.h   
-I-
    就是取消前一个参数的功能,所以一般在-Idir之后使用   
-idirafter [dir]   
    在-I的目录里面查找失败,将到目录dir里面查找。
-iprefix [prefix],-iwithprefix [dir]
    一般一起使用,当-I的目录查找失败,会到prefix+dir下查找。
-L[dir]   
    编译的时候,指定搜索库的路径。比如你自己的库,可以用它指定目录,不然编译器将只在标准库的
    目录找。这个dir就是目录的名称。
-l[library]    
    指定编译的时使用的库,例子用法   
    gcc -lcurses hello.c   
    使用curses库编译连接,生成程序。 

更多命令可在ubuntu终端中输入 man gcc 查看

1.2 c++程序输出 Hello World:

首先创建一个文件          格式:  nano+文件名

ubuntu 编译器,数据库在所创的文件中输入c++代码:

#include<iostream>
using namespace std;
int main()
{

   cout<<"Hello World!"<<endl;
   return 0;

}

ubuntu 编译器,数据库

退出并保存文件。

g++ a -o b   将a文件用c++的编译方式编译出名字b的可执行文件

用g++编译该文件

g++ Hello_World.c -o Hello_World.cpp

ls 查看是否生成可执行文件,并运行。

ubuntu 编译器,数据库运行Hello_World.cpp 文件

ubuntu 编译器,数据库运行后输出了  Hello World!


1.3 c语言程序输出 Hello World:

若用c语言,需要用gcc进行编译,语法相差不大

首先创建一个文本文件

ubuntu 编译器,数据库

在文件中输入c语言代码

#include  <stdio.h>
int main()
{
 printf("%s\n","Hello World!");
 return 1;
}

保存文件,并编译文件为可执行文件 

ubuntu 编译器,数据库

查看是否生成可执行文件

ubuntu 编译器,数据库

运行可执行文件

ubuntu 编译器,数据库

输出Hello World!

二. 编写一个主程序文件main1.c和一个子程序文件sub1.c,实现函数间的调用

要求:子程序包含算术运算函数float  x2x(int a,int b),此函数功能对输入两个整数作运算,结果返回浮点数;主函数定义并赋值两个整形变量,然后调用x2x函数,将结果打印出来。

思路:先编写sub1.c程序,再将封装为库函数,在主函数中引用sub1.c的头文件,调用其库函数。

2.1  编写sub1.c 和main1.c 函数

2.1.1 编写sub1.c函数

#include <stdio.h>
float x2x(int a,int b)
{
     float x=(float)a;
     float y=(float)b;
     return x/y;
}

2.1.2 编写main1.c函数,赋值a=3,b=2

#include "sub1.h"
void main()
{
  int a=3,b=2;
  printf("%f", x2x(3,2));
}

2.2 将sub1.c程序封装为动态库或者静态库

先将其转为 .o 二进制文件

gcc -c sub1.c

查看是否生成sub1.o文件

ubuntu 编译器,数据库2.2.1  生成静态库

ar -crv lib+库名.a  +所用程序

ubuntu 编译器,数据库

 当前目录下生成libsub.a静态库文件ubuntu 编译器,数据库

对主程序进行编译,编译需要用到刚才生成的库

ubuntu 编译器,数据库

当前目录生成了名为main1的可执行文件,运行并查看结果:

ubuntu 编译器,数据库

输出结果为1.500000

2.2.1  生成动态库

生成动态库的方法跟静态库的方法类似

gcc  -shared -fPIC -o lib+库名.so 所用程序ubuntu 编译器,数据库

当前目录下生成libsub1.so动态库文件

ubuntu 编译器,数据库

用此库将main1.c文件编译为可执行文件

ubuntu 编译器,数据库

执行当前目录下生成的main_1可执行文件

ubuntu 编译器,数据库

同样输出了结果1.500000

2.2.3 动态库和静态库的区别

       在Linux中,库函数分为静态库和动态库两种。静态库以.a作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用后都会生成一个副本,而动态库则只有一个副本,更省空间。

三.  在windows下系统下用DVC++编程实现

3.1 编辑主程序

ubuntu 编译器,数据库

3.2 编辑子程序

ubuntu 编译器,数据库

 3.3 运行效果

ubuntu 编译器,数据库

四.  用CMakefile方式编程主程序

4.1 CMakefile 简介

        理论上,任意一个c语言程序都可以用gcc来编译。但是当程序规模越来越大时,一个工程可能有许多个文件夹和源文件,这时输入的编译命令就越来越长。通常,一个小型的c语言项目可能含有几十类,各类间还存在着复杂的依赖关系。其中一部分要编译为可执行文件。另一部分编译成库文件。如果仅靠gcc命令,则需要输入大量的编译指令,整个编译过程会变得异常繁琐。因此对于c项目,使用一些工程管理工具会更加高效。在历史上,工程师们曾使用makefile进行自动编译,但是cmake比它更加方便。并且cmake在工程上广泛应用。总之,cmake是用来管理源代码的工具,可以对源代码进行编译、生成库等。

4.2 创建CMakeListss.txt

CMakeLists.txt文件用来告诉cmake要对目录下的文件做什么事情。

ubuntu 编译器,数据库

第一句是要求cmake编译器的最小版本

第二句是创建一个工程文件名为D

4.3 在CMakeLists.txt中添加添加可执行文件,给sub1.c添加静态库,并添加链接

ubuntu 编译器,数据库

 1. 将main1.c转为名为main2的可执行文件

2. 将main1.c转为名为main3的可执行文件

3. 将sub1.c封装为名为libsub1的静态库

4. 将sub1.c封装为名为libsub2的动态库

5. 生成的main2可执行文件与动态库进行连接

6. 生成的main3可执行文件与静态库进行连接

4.4 执行 CMakeLists.txt,并查看是否生成上述文件

调用cmake对该工程进行cmake编译

ubuntu 编译器,数据库

cmake会输出一些编译信息,然后再当前目录下生成一些中间文件,其中最重要的就是MakeFile。

由于其是自动生成的,不用修改它。现在用make对该工程进行编译:

ubuntu 编译器,数据库

查看生成的文件

ubuntu 编译器,数据库

 生成了main2 main3 可执行文件,liblibsub1.a静态库 以及liblibsub2.so动态库

4.5 分别执行连接动态库和静态库的可执行文件

运行生成的main2 和main3文件ubuntu 编译器,数据库

都输出1.500000

五. 总结

1. 在ubuntu18环境下,可以用gcc对c语言程序进行编译和运行,用g++可以对c++语言程序进行编译和运行。

2. ubuntu环境下用gcc编译一个文件比较简单,只需将程序转为二进制可执行文件即可,但是在运用到函数之间的调用的时候,即运用到库时,较为复杂。

3. windows环境下对c语言的编写和运行也是同样的步骤,但是windows系统中用到的DEV C++是集成开发的软件,比较迅速、方便。 ubuntu中也有IDE软件,比如KDV。

4. 在执行很多程序之间的相互调用时候,gcc生成库较为复杂,用Makefile的方式比较简便。

5. ubuntu中的库分为静态库和动态库,运用动态库更加节省空间。

PS:参考资料:  g++入门教程 - 码农教程 (manongjc.com)

                          《视觉SLAM十四讲从理论到实践》第二版  高翔 张涛 刘毅 颜沁睿 著文章来源地址https://www.toymoban.com/news/detail-756832.html

到了这里,关于Ubuntu 用gcc/CMakefile编译器 编译、运行c语言程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在 Ubuntu 18.04 x86_64 上面安装 Linux-ARMv7 A/L GCC编译器

    一键安装  Linux-ARMv7A GCC编译器:(平板、手机一般是) ########################### 输入以下命令: 1、sudo apt update 2、sudo apt install gcc-arm-linux-gnueabi      sudo apt install g++-arm-linux-gnueabi 3、arm-linux-gnueabi-gcc --version 一键安装  Linux-ARMv7L GCC编译器:(机顶盒一般是) 1、sudo apt update

    2024年02月22日
    浏览(60)
  • Linux:编译器 - gcc

    GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器。本博客只讲解gcc,g++的语法和选项和gcc都是一致的。 gcc 编译

    2024年04月14日
    浏览(78)
  • Linux GCC常用命令以及GCC编译器

    GCC 是编译工具,它的意思是 GNU C Compiler 。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言等等。而 GCC 也不再单只是 GNU C 语言编译器的意

    2024年02月05日
    浏览(43)
  • Linux——gcc/g++编译器

    目录 I.Linux编译器 1.gcc/g++编译器 在C代码生成可执行程序的过程中,会有四个过程: 1预处理,2编译,3汇编,4链接 Linux对.c文件分辨进行预处理,编译,汇编三大步指令: 预处理指令: 编译指令: 汇编指令: 接下来说一说链接过程: II.动静态链接  一.动态链接 二.静态链接

    2024年02月04日
    浏览(46)
  • Linux编译器gcc/g++

    以gcc编译 以g++编译,但是此时会发现没有g++这个指令,所有需要安装它,安装指令 yum install gcc gcc-c++ gcc和g++都会形成可执行文件a.out gcc只能编译c语言代码,g++能编译c/c++ 以c程序为例,来看看它从一个文本类的c程序编译成计算机可以认识的二进制程序它需要经过四个阶段 预

    2024年02月10日
    浏览(39)
  • Linux--编译器-gcc/g++使用

    目录 前言 1.看一段样例  2.程序的翻译过程 1.第一个阶段:预处理 2.第二个阶段:编译 3.第三个阶段:汇编 4.第四个阶段:链接 3.程序的编译为什么是这个样子? 4. 关于编译器 5.链接(动静态链接) 1.首先,我们来看一段样例(见一下) 2.见完之后,我们来看一下程序的翻译

    2024年02月20日
    浏览(59)
  • Linux编译器 gcc与g++

    程序的编译过程: 1、 预处理 (头文件包含、消除注释、宏定义替换) 2、 编译 (将语言替换成汇编代码) 3、 汇编 (将汇编指令转换为二进制指令) 4、 链接 (合并段表、符号表合并及重定位) 我们可以通过gcc工具实现程序的编译过程: 2.1 预处理 预处理会完成:①头

    2023年04月18日
    浏览(70)
  • Linux编译器——gcc/g++使用

    前言:  在上一篇,我们学习了关于文本编辑器 vim 的全部知识,今天给大家带来的是关于Linux编译器—gcc/使用的详细介绍。 本文目录  (一)温习程序的产生的过程 1、前言 2、程序的产生过程 3、🌜初步认识 gcc🌛 a) gcc的基本概念 b)gcc的基本特点 4、使用方法💻 (二)

    2023年04月17日
    浏览(52)
  • 【Linux】编译器-gcc/g++使用

    个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。 我们先写一段简单的代码: 当我们进行编译的时候: 发现根本就编译不了。 这个是因为编译器版本的问题: 查看编译器的版

    2024年03月11日
    浏览(126)
  • 【Linux】03 GCC编译器的使用

     在使用gcc编译程序时,编译过程可以简要划分为4个阶段:         预处理、编译、汇编、链接 这个阶段主要处理源文件中的#indef、#include和#define预处理命令; 这里主要是把一些include的头文件和一些宏定义,放到源文件中。 编译命令: gcc  -E  -o  hello.i  hello.c 将经过预处

    2024年01月20日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包