gcc g++ ld 相关编译器选项

本文介绍了gcc、g++和ld的常用编译器选项,包括-nm用于查看.o文件中使用的函数,-ldd列出动态库,-shared和-fPIC创建共享库,-g添加调试信息,-w和-Wall控制警告,-M和-MD自动生成依赖关系,-O优化级别,-ansi和-pedantic遵循标准,-I和-L指定头文件和库路径,-l链接库,-static链接静态库,以及关于动态链接器(ld.so)和共享库的环境变量和配置文件。同时提供了一个使用共享库编译的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1不包含make的相关知识
2主要已见过的程序为makefile文件用到的选项为主


nm -C dev_insert.o
nm 列出了 .o 中所有用到的函数?以及自己导出的函数。
ldd dev_insert.cgi 列出了启用到的所有 动态库


========================================

-shared -fPIC
-g 为生成文件添加调试信息 gdb会用到
-o 生成可执行文件

-w 不提示警告,bad idea
-Wall 提示所有警告
-werror 讲所有警告视为错误

-MM Output a make-compatible dependency list.(就像下面讲到的 -M 在早期的自动化make 较大项目时用到)
     (这是在linux 入门 应用 精通 书中知道的)
-M 让gcc自动生成 某个c或cpp文件的依赖关系(通过分析头文件实现)(这是我在学make的时候知道的)
-MD 同上,但同时将依赖关系写入 .d文件
eg gcc -M hello.cpp ====> hello.o : hello.cpp hello.h 其他头文件 stdio.h 等
  *(在oxford学生写的makefile里面用到,make手册推荐使用)

-O 优化代码
-Onum 优化代码的级别 0<=num<=3

-ansi 支持ansi/iso c标准
-pedantic Emit all warnings required by the ANSI/ISO C standard.

-I(大写)包含头文件目录 .h

-L 包含库文件目录 .a .so等
-l(小写) 指明链接哪一个库 eg -lpthread -lttc 其实链接的是 libpthread libttc
eg $gcc myapp.c -L/home/fred/lib -I/home/fred/include -lnew

-static 连接静态库
           gcc默认是连接动态库的,如果非要连接静态库,请显示的指明 static选项
           By default, gcc uses shared libraries, so if you must link against static libraries, you have
to use the -static option.
eg $ gcc cursesapp.c -lncurses -static

-v Show the commands used in each step of compilation

《linux 入门 应用 精通》
还有更多更详细的参数介绍,这里不一一列举了,没时间看了。
Debugging Options -g -g2 -ggdb
Optimization Options
Error Checking and Warnings -ansi -pedant
// 一些现实中的例子
LIBS = -z defs
CCFLAGS = -g -Wall

关于共享库

dynamic linker/loader ld.so 用到了两个环境变量
$LD_LIBRARY_PATH (在该环境变量路径下搜索.so库)和 $LD_PRELOAD( 该路径下库会被预先加载)

还用到了两个配置文件
/etc/ld.so.conf (在该文件配置路径下搜索.so库)以及/etc/ld.so.preload( 和$LD_PRELOAD一样)

如果程序没有找到 共享库,那么
临时的修改环境变量$LD_LIBRARY_PATH 使之包含使用到的共享库的路径即可.

=-====================
一个采用共享库的 编译的 例子。

all: errtest liberr.o liberr.so dltest


errtest: errtest.c liberr.o


liberr.o: liberr.c
 gcc -g -Wall -c liberr.c -o liberr.o
 ar rcs liberr.a liberr.o


liberr.so: liberr.c
 gcc -fPIC -g -Wall -c liberr.c -o liberr.o
 gcc -g -Wall -shared -Wl,-soname,liberr.1 -o liberr.so.1.0.0 liberr.o -lc
 ln -s liberr.so.1.0.0 liberr.so.1
 ln -s liberr.so.1.0.0 liberr.so


dltest: dltest.c liberr.so
 gcc -g -Wall dltest.c -ldl -o dltest


clean:
 rm -rf errtest liberr.o liberr.a dltest liberr.so* errtest.log

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值