Linux中C程序调试、makefile
gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程:
- 预处理:gcc -E hello.c hello.i。-E指定执行到预处理结束,下面类似。
- 编译:gcc -S hello.i -o hello.S。
- 汇编:gcc -c hello.S -o hello.o。
- 链接:gcc hello.o -o hello。链接阶段就需要涉及到函数库了,举例说明:要执行printf函数,我们都会#include <stdio.h>,但是预处理只能包含进stdio.h文件,也就是只有printf函数的声明,而函数实现在函数库libc.so.6中,虽然没有特别指定这个库,但是只要头文件中有声明,gcc会到系统默认搜索路径"/usr/lib"下查找并链接函数库,这样才能执行printf函数。
函数库有静态库和动态库两种,简单来说,由.h和.c文件来生成函数库,编译后,就可以在其他.c文件中使用函数:
静态库的创建和使用:
- 将.h和.c文件汇编成目标文件:gcc -c libhello.c -o libhello.o。
- 将目标文件归档,封装成库:ar -rc libhello.a libhello.o。
- 在编译过程中使用静态库:gcc usehello.c -o usehello_static libhello.a。然后就可以执行程序了。
动态库的创建和使用:
- 汇编生成目标文件,和静态库一样:gcc -c libhello.c。
- 编译生成动态库:gcc libhello.o -shared -W1,-soname,libhello.so -o libhello.so。
- 编译程序和动态库:gcc usehello.c -o usehello_dy -lhello -L ./ 。
- 执行时,也需要指明动态库: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
如果在运行动态库时,不想指明库的路径,则有两种方法:
- 在/usr/lib或者/lib目录下,存放动态库或其链接。
- 在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的更多相关文章
- Linux中各类程序的配置文件位置
目录 Linux中各类程序的配置文件位置 1.启动引导程序配置文件 2.系统启动文件核脚本 3.网络配置文件 4.超级服务程序配置文件和目录 5.硬件配置 6.硬件访问文件 7.扫描仪配置文件 8.打 ...
- 转载linux c语言程序的Makefile编写
对于程序设计员来说,makefile是我们绕不过去的一个坎.可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓.毕竟工具本身已经帮我们做好了全部的编译流程.但是在Linux上 ...
- linux下的程序调试方法汇总
搞电子都知道,电路不是焊接出来的,是调试出来的.程序员也一定认同,程序不是写出来的,是调试出来的.那么调试工具就显得尤为重要,linux作为笔者重要的开发平台,在linux中讨论调试工具主要是为那些入 ...
- linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?
1.main函数是一个进程还是一个线程? 不知道你是用c创建的,还是用java创建的. 因为它们都是以main()做为入口开始运行的. 是一个线程,同时还是一个进程. 在现在的操作系统中,都是多线程的 ...
- Linux中应用程序如何使用系统调用syscall
最近在做Android,其中一个任务是写一个能在Linux命令行运行的测试AP,运行这个AP就能关闭设备电源,即Power Off. 在 Linux内核中已经找到了关闭电源的函数kernel_powe ...
- linux中安装程序及账户管理
程序安装及管理 1. Linux 应用程序基础 Linux命令与应用程序的关系 1):文件位置 系统命令:一般在/bin和/sbin目录中,或为Shell内部指令 应用程序:通常在/usr/bin和 ...
- Linux 中 IDEA 不能调试(Debug)项目
问题描述: can't debug project on idea linux. 在Linux 中, IDEA能运行项目,但是点击调试项目,弹出警告.警告内容如下: Required connecto ...
- TCPflow:在Linux中分析和调试网络流量的利器(转)
TCPflow是一款功能强大的.基于命令行的免费开源工具,用于在Unix之类的系统(如Linux)上分析网络流量.它可捕获通过TCP连接接收或传输的数据,并存储在文件中供以后分析,采用的格式便于协议分 ...
- 让linux中的程序崩溃时生成core文件
当我们的linux程序崩溃的时候,常常会有这样的提示: Segmentation fault (core dumped) 段错误 (核心已转储) 提示说生成了core文件,但是此功能 ...
随机推荐
- scikit-learn随机森林调参小结
在Bagging与随机森林算法原理小结中,我们对随机森林(Random Forest, 以下简称RF)的原理做了总结.本文就从实践的角度对RF做一个总结.重点讲述scikit-learn中RF的调参注 ...
- Yii2的深入学习--行为Behavior
我们先来看下行为在 Yii2 中的使用,如下内容摘自 Yii2中文文档 行为是 [[yii\base\Behavior]] 或其子类的实例.行为,也称为 mixins,可以无须改变类继承关系即可增强一 ...
- SharePoint 2103 Check user permission on list
一.需求: check user 对SharePoint list 的permission 代码如下: private static string GetListPermission(SPList l ...
- 学习SpringMVC——你们要的REST风格的CRUD来了
来来来,让一下,客官,您要的REST清蒸CRUD来了,火候刚刚好,不油不腻,请慢用~~~ 如果说前面是准备调料,洗菜,切菜,摆盘,那么今天就来完整的上道菜,主要说的是基于REST风格实现数据的增删改查 ...
- 深入浅出JavaScript之this
JavaScript中的this比较灵活,根据在不同环境下,或者同一个函数在不同方式调用下,this都有可能是不同的.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 下面是我的学习笔记 ...
- 翻唱曲练习:龙珠改主题曲 【Dragon Soul】龙之魂
首先这是个人翻唱曲: 这个是原版(燃): 伴奏: 翻唱合成为动漫AMV 出镜翻唱: 全民K歌链接: http://kg.qq.com/node/play?s=aYpbMWb6UwoU&g_f ...
- 5.JAVA之GUI编程窗体事件
我们回顾下第三篇时的内容: 在3.JAVA之GUI编程Frame窗口中窗体是无法直接关闭的,想要关闭须进程管理器结束进程方式关掉. 现在我们就来解决下这个问题. ******************* ...
- 在Azure上的VM镜像库中找到想要的镜像
Azure上的虚机镜像库中, 有很多的镜像,其中当然也包括了用户自定义上传的镜像. 在Powershell中如果想使用这些镜像的话, 则需要知道其名称 下面这条命令,可以获得所有的镜像信息 $imag ...
- 《c# 从入门经典》 (第6版) - 变量和表达式
1,程序就是对一系列数据的操作:数据最终是存储在内存中的0和1数据流:我们在桌面上的任何操作都会改变内存中的数据. 2,变量存储在计算机中占用着一定的内存空间 bit: 位,计算机的最小存储单位,存储 ...
- Java 单例模式详解
概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...