首页 > 系统相关 >linuxc

linuxc

时间:2024-06-06 22:35:49浏览次数:31  
标签:gcc exe 符号 静态 linuxc 动态 链接

Linux编程环境编译链接

3.1 Linux C程序的编译执行

3.1.1 gcc常用指令

https://gcc.gnu.org/onlinedocs/gcc/#toc-GCC-Command-Options
构建相关:

  • 看不懂没事,可以看下一个加粗部分"调试和优化相关的示例"
  • -E:预处理,生成.i文件
  • -S:预处理+编译,生成.s汇编语言文件
  • -c:预处理+编译+汇编,生成.o目标文件
  • -o:output,指定生成文件名
  • -Idir:将dir目录添加到头文件搜索目录中
  • -Ldir:将dir目录添加到库文件搜索目录中
  • -lname:将libname.so或libname.a链接到可执行文件中
    • 注意,linux默认使用动态链接,动态链接指的是将动态库链接到可执行程序上,反则反之.
  • -Bstatic:仅链接过程中使用静态链接模式
  • -static:全局静态链接模式
  • -shared:制作动态库.
    • 共享库会在具体的链接行为中将自己的特征信息传给被链接到的程序(即创建对动态库的依赖),在执行前(执行中)会启动加载器,根据连接时传入的特征信息找到动态库,并加载执行.
  • -fPIC:生成位置独立代码(制作动态库的必要条件)
  • -std=c99/-std=c11:执行标准
    调试和优化相关:
  • -g:生成带有调试信息的可执行文件
  • -O:编译期优化
  • -Ox:x级优化,一般x=2,x=0是默认且不优化
  • -Os:生成最短的代码
    示例:
    将库文件视为半成品(既有原料属性也有成品属性),用途是在加工(链接)过程中使用,帮助其他文件x合成文件x对应的库(或可执行程序).

制作静态\动态库,是制造两种不同格式的文件
静态链接是尝试将指定库的代码直接嵌入可执行文件
动态链接是将动态库的特征信息嵌入到可执行文件,运行时链接器再加载
可见:exe静态方式链接动态库,是尝试链接name.so对应的name.a,找不到则报错
还见:exe动态方式链接静态库,是不允许的,即运行时不可加载静态库,一种实现方式是exe动态方式链接某动态库,这需要提前在制作该动态库时就静态链接静态库,使其代码嵌入动态库

因此,建议:
制作静态库时,只链接(子)静态库
制作动态库时,可以链接(子)静态库也可以链接(子)动态库

制作库和链接的方法很多,但应遵循高内聚低耦合的链接思路,太复杂的编译选项通常会引入不必要的问题.
一般顺序:
编译工具 全局选项 主源文件 细分选项和其他文件 -o 目标文件

//制作静态库libadd.a
gcc -c -o add.o add.c
ar rc libadd.a add.o
//可执行文件静态链接静态库
gcc -o exe exe.c -Bstatic -L. -ladd
//位置独立代码的生成阶段
gcc -c -fPIC add.c -o add.o
//制作动态库
gcc -shared add.o -o libadd.so
//可执行文件动态链接动态库
gcc exe.c -L. -ladd -o exe
//需要将LD_LIBRARY_PATH暴露给加载器
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
//或者将动态库添加到以下文件夹中
/etc/ld.so.conf

nm工具基本用法(chatgpt4o)

nm [选项] 文件
常用选项
无选项:默认列出所有符号。
-a:显示所有符号,包括调试符号。
-g:仅显示全局(全局和外部)符号。
-u:仅显示未定义符号。
-r:按符号名称的逆序排列。
-n:按符号值排序。
-S:显示符号大小。
-l:显示符号定义的源代码行号(如果可用)。
-C:将 C++ 符号名解混淆(demangle)。
--help:显示帮助信息。
--version:显示版本信息。
符号类型说明
nm 的输出包括符号地址、符号类型和符号名称。常见的符号类型包括:

U:未定义符号。
T:代码段中的符号(函数)。
D:初始化的数据段中的符号。
B:未初始化的数据段(BSS)中的符号。
C:共用符号。
W:弱符号(可被同名的全局符号覆盖)。
V:弱对象符号。

3.1.2

标签:gcc,exe,符号,静态,linuxc,动态,链接
From: https://www.cnblogs.com/djwca/p/18236194

相关文章

  • linuxC语言点灯
    大部分情况下都是使用C语言去编写的。只是在开始部分用汇编来初始化一下C语言环境,比如初始化DDR、设置堆栈指针SP等等,当这些工作都做完以后就可以进入C语言环境,也就是运行C语言代码,一般都是进入main函数。所以我们有两部分文件要做:①、汇编文件汇编文件只是用来完......
  • Linuxcentos7配置网卡的方法(非gui篇)
    网卡配置方法有好几种,本次讲述的是非gui的centos7配置方法 目录 1、普通配置网卡方法: 2、使用命令行工具nmcli(NetworkManager的命令行界面)方法:删除连接:创建新的连接:注意事项:附记:  1、普通配置网卡方法:由于本次操作过程和我之前发布的文章的第一种原理......
  • 【Linux】linuxCNC+Qt+Opencascade+kdl+hal 实时6轴机器人控制器
    CNC机器人程序框架机器人模型笔记:debian重启后无法打开共享目录最新版搜狗输入法安装后不支持中文,需要安装旧版本的sogoupinyin_4.0.1.2800_x86_64.deb可用数控机器人在哪些领域应用有优势数控机器人在多个领域都展现出了显著的优势,特别是在需要高精度和......
  • 重读LinuxC编程
    LinuxC编程一站式学习(akaedu.github.io)开始复习,上一次是大二下在微信读书,上面统计花了30+hour。实际可能不只,而且似乎上面内容也有所缺失,所以并不算能看完。从前言来看,这书至少需要4个月才能学完,我凭什么一个月每天一小时就能学会呢。不是孤立地讲C语言,而是和编译原理、......
  • Linux : FinalShell连不上LinuxCentOS-7 (connection time out)
    依赖于一的二三系统连接不上。后想起更改了系统名称将系统通过快照更改到上一个状态即可 ......
  • (第26章)LinuxC本质中链表、二叉树和哈希表
    文章目录一、单链表的结构决定只能出栈,入栈1.链表的结构2.链表与数组的区别3.单链表所有基本操作代码(1)链表的插入(2)链表的查找(3)链表的删除(3)遍历整个链表(4)销毁整个链表4.习题5.C++NULL指针二、双向链表结构决定可以出队和入队1.在上面的单项链表上改改,得到双向链表2.改进双向链表:新增......
  • 嵌入式LinuxC语言开发工具
    C语言产生的历史背景嵌入式Linux下C语言的开发环境嵌入式Linux下的编辑器vi嵌入式Linux下的编译器GCC嵌入式Linux下的调试器GDB嵌入式Linux下的工程管理器makeEclipse集成......
  • LinuxCentOS在不删除Linux自带JDK的情况下安装JDK1.8(图文教程:重点是环境变量的配置)...
    环境:CentOS6.9安装JAVAJDK1.81.创建两个文件夹?mkdir-p/export/softmkdir/export/servers2.?上传jdk安装包到?/export/soft?命令:rz?选择JDK......