转自http://www.tuicool.com/articles/yMnAFb
(1)gcc对多个分立源文件的编译(-c, -o)
$ls
test.h test.c main.c
$gcc -c test.c -o test.o #生成中间文件test.o
$gcc -c main.c -o main.o #生成中间文件main.o
$gcc test.o main.o -o main #生成最终的main可执行文件
(2)gcc动态链接库的编译(-shared, -fPIC, -L)
$ls
test.h test.c main.c
$gcc -c test.c -o #生成中间文件test.o
$gcc -shared -fPIC test.o -o libtest.so #利用中间文件生成动态库
$gcc main.c -L. -ltest -o main #链接动态库生成最终的main可执行文件
#如果将libtest.so生成放入./lib/下,则
$gcc -shared -fPIC test.o -o ./lib/libtest.so #利用中间文件生成动态库
$gcc main.c -L ./lib -ltest -o main #链接动态库生成最终的main可执行文件
#注意:
-L. 表示为当前目录
-fPIC参数,作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
(3)动态链接库的使用
1)隐式使用
#1 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
$ln -s /usr/test/lib/*.so /usr/lib
$ldconfig
#2 修改LD_LIBRARY_PATH
$export LD_LIBRARY_PATH=/usr/test/lib :$LD_LIBRARY_PATH
$ldconfig
#3 修改/etc/ld.so.conf
#@1 使用vim添加
$vim /etc/ld.so.conf
#手动添加 /usr/test/lib 一行到文件中
$ldconfig
#@2 使用管道追加
$echo "/usr/test/lib" >> /etc/ld.so.conf
$ldconfig
2)显式使用
在程序中显式调用dlopen, dlsym, dlclose系列函数(#include <dlfcn.h>)来实现,这里不详述。
(4)gcc静态库的编译和使用(-static, ar)
$ls
test.h test.c main.c
$gcc -c test.c -o #生成中间文件test.o
$ar crv libtest.a test.o #生成静态库libtest.a
a - test.o
$gcc main.c libtest.a -o main #链接静态库生成最终的main可执行文件
($gcc main.c -static -ltest -o main) #优先选择静态库
#如果将libtest.a生成放入./lib/下,则
$ar crv ./lib/libtest.a test.o #生成静态库libtest.a
a - test.o
$gcc main.c ./lib/libtest.a -o main #链接静态库生成最终的main可执行文件
($gcc main.c -L ./lib -static -ltest -o main) #优先选择静态库
#注意:
ar命令可以用来创建、修改库。
c:创建一个库。不管库是否存在,都将创建。
r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。
v:该选项用来显示执行操作选项的附加信息。
(5)编译警告选项同时将警告记录输出到文件(-Wall和2,-Werror,-pedantic)
#以程序中存在一个没有使用到的变量b为例
$ls
test.h test.c main.c
$gcc -c test.c -o test.o -Wall 2> debug.txt
c:4: warning: unused variable 'b'
$cat debug.txt
c:4: warning: unused variable 'b'
#当然如果你有代码洁癖症,可以加-Werror选项,再有警告的地方就停止编译
$gcc -Werror -c test.c -o test.o
#pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码
$gcc -pedantic -c test.c -o test.o
(6)指定头文件的路径(-I)
$gcc –c –I /usr/dev/mysql/include test.c –o test.o
(7)汇编(-E,-S)
#预处理,将头文件等内容插入到test.c中
$gcc -E test.c -o test.i($gcc -E test.c)
#生成汇编代码
$gcc -S test.i -o test.s
#通过汇编码生成目标文件
$gcc -c test.s -o test.o
(8)调式(-g)
$gcc -c test.s -o test.o
其他
gcc 命令的常用选项
选项 解释
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,
例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串“1”定义 MACRO 宏。
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
-m486 针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-shared 生成共享目标文件。通常用在建立共享库时。
-static 禁止使用共享连接。
-UMACRO 取消对 MACRO 宏的定义。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。