gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程:

  1. 预处理:gcc -E hello.c hello.i。-E指定执行到预处理结束,下面类似。
  2. 编译:gcc -S hello.i -o hello.S。
  3. 汇编:gcc -c hello.S -o hello.o。
  4. 链接:gcc hello.o -o hello。链接阶段就需要涉及到函数库了,举例说明:要执行printf函数,我们都会#include <stdio.h>,但是预处理只能包含进stdio.h文件,也就是只有printf函数的声明,而函数实现在函数库libc.so.6中,虽然没有特别指定这个库,但是只要头文件中有声明,gcc会到系统默认搜索路径"/usr/lib"下查找并链接函数库,这样才能执行printf函数。

函数库有静态库和动态库两种,简单来说,由.h和.c文件来生成函数库,编译后,就可以在其他.c文件中使用函数:

静态库的创建和使用:

  1. 将.h和.c文件汇编成目标文件:gcc -c libhello.c -o libhello.o。
  2. 将目标文件归档,封装成库:ar -rc libhello.a libhello.o。
  3. 在编译过程中使用静态库:gcc usehello.c -o usehello_static libhello.a。然后就可以执行程序了。

动态库的创建和使用:

  1. 汇编生成目标文件,和静态库一样:gcc -c libhello.c。
  2. 编译生成动态库:gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so。
  3. 编译程序和动态库:gcc usehello.c -o usehello_dy -lhello -L ./ 。
  4. 执行时,也需要指明动态库:LD_LIBRARY_PATH=$(pwd) ./usehello_dy 。

当然还可以统一函数库版本的使用:

gcc -c libhello.c
gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so.1.0 //即生成库可能就会有多个版本
ln -s libhello.so.1.0 libhello.so //所以用一个软链接来更新版本,对外却统一显示
gcc usehello.c -o usehello_dy -lhello -L ./
LD_LIBRARY_PATH=$(pwd) ./usehello_dy

如果在运行动态库时,不想指明库的路径,则有两种方法:

  1. 在/usr/lib或者/lib目录下,存放动态库或其链接。
  2. 在etc/ld.so.conf文件中,追加库或者链接所在的路径;然后退出保存,执行ldconfig命令使更改生效。

工程管理器make:

语法:系统默认自动变量:

$<第一个依赖文件、$@目标文件。

用户自定义变量:变量=值——引用$(变量)。

将静态库用makefile完成,用make管理:

usehello_static: usehello.c libhello.a
gcc $< -o $@ libhello.a
libhello.a: libhello.o
ar -rc $@ $<
libhello.o: libhello.c
gcc -c $<
clean:
rm usehello_static libhello.a libhello.o

动态库:

usehello_dy: usehello.c libhello.so
gcc $< -o $@ libhello.so -L ./
libhello.so: libhello.o
gcc $< -shared -W1,-soname,libhello.so -o $@
libhello.o: libhello.c
gcc -c $<
clean:
rm usehello_dy libhello.so libhello.o

在makefile里面写lhello,它不认。

Linux中C程序调试、makefile的更多相关文章

  1. Linux中各类程序的配置文件位置

    目录 Linux中各类程序的配置文件位置 1.启动引导程序配置文件 2.系统启动文件核脚本 3.网络配置文件 4.超级服务程序配置文件和目录 5.硬件配置 6.硬件访问文件 7.扫描仪配置文件 8.打 ...

  2. 转载linux c语言程序的Makefile编写

    对于程序设计员来说,makefile是我们绕不过去的一个坎.可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓.毕竟工具本身已经帮我们做好了全部的编译流程.但是在Linux上 ...

  3. linux下的程序调试方法汇总

    搞电子都知道,电路不是焊接出来的,是调试出来的.程序员也一定认同,程序不是写出来的,是调试出来的.那么调试工具就显得尤为重要,linux作为笔者重要的开发平台,在linux中讨论调试工具主要是为那些入 ...

  4. linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?

    1.main函数是一个进程还是一个线程? 不知道你是用c创建的,还是用java创建的. 因为它们都是以main()做为入口开始运行的. 是一个线程,同时还是一个进程. 在现在的操作系统中,都是多线程的 ...

  5. Linux中应用程序如何使用系统调用syscall

    最近在做Android,其中一个任务是写一个能在Linux命令行运行的测试AP,运行这个AP就能关闭设备电源,即Power Off. 在 Linux内核中已经找到了关闭电源的函数kernel_powe ...

  6. linux中安装程序及账户管理

    程序安装及管理 1. Linux 应用程序基础  Linux命令与应用程序的关系 1):文件位置 系统命令:一般在/bin和/sbin目录中,或为Shell内部指令 应用程序:通常在/usr/bin和 ...

  7. Linux 中 IDEA 不能调试(Debug)项目

    问题描述: can't debug project on idea linux. 在Linux 中, IDEA能运行项目,但是点击调试项目,弹出警告.警告内容如下: Required connecto ...

  8. TCPflow:在Linux中分析和调试网络流量的利器(转)

    TCPflow是一款功能强大的.基于命令行的免费开源工具,用于在Unix之类的系统(如Linux)上分析网络流量.它可捕获通过TCP连接接收或传输的数据,并存储在文件中供以后分析,采用的格式便于协议分 ...

  9. 让linux中的程序崩溃时生成core文件

    当我们的linux程序崩溃的时候,常常会有这样的提示:    Segmentation fault (core dumped)    段错误 (核心已转储)    提示说生成了core文件,但是此功能 ...

随机推荐

  1. JavaScript -Array.form方法

    Array.from方法可以把一个类数组或者课遍历对象转换为一个正真的数组 语法 Array.from(arrayLike[, mapFn[, thisArg]]) 参数 arrayLike 想要转换 ...

  2. Log4net入门(控制台篇)

    Log4net是Apache公司的log4j™的.NET版本,用于帮助.NET开发人员将日志信息输出到各种不同的输出源(Appender),常见的输出源包括控制台.日志文件和数据库等.本篇主要讨论如何 ...

  3. Java 计算N阶乘末尾0的个数-LeetCode 172 Factorial Trailing Zeroes

    题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in ...

  4. Oracle 11g DG配置简明版

    环境: 主库A机:在线生产环境,RHEL 6.4 + Oracle 11.2.0.3 备库B机:新增备机,RHEL 6.4 需求: 对生产环境最小影响前提下配置DG备库. 目录: 一.B机安装相同版本 ...

  5. Windows Programming ---- Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  6. Python基础(二)

    本章内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典.set集合) for 循环 enumrate range和x ...

  7. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB

    原文:Working with SQL Server LocalDB 作者:Rick Anderson 翻译: 魏美娟(初见) 校对: 孟帅洋(书缘).张硕(Apple).许登洋(Seay) Appl ...

  8. .Net语言 APP开发平台——Smobiler学习日志:Poplist控件的正确打开方式以及如何快速实现

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  9. LINQ to SQL语句(10)之Insert

    1.简单形式 说明:new一个对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges()提交到数据库. var newCustomer = new Custo ...

  10. C# - 多线程 之 信号系统

    基础概览 多线程之信号系统命名空间 using System.Threading; 线程同步类的继承层次关系图 终止状态和非终止状态 在终止状态下,被WaitOne()阻塞的线程会逐个得到释放.如果一 ...