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