GCC在Linux编译时的简单用法
1.单个文件编译
编写源文件hello.c
编译:gcc hello.c
生成a.out
指定生成文件名:gcc -o test hello.c
生成test
2.编译成目标文件
编译:gcc -c hello.c
生成:hello.o
指定生成文件名:gcc -c -o test.o hello.c
编译:gcc -c file1.c file2.c file3.c
生成:file1.o file2.o file3.o
3.多文件编译
编写计算字符串长度函数string.c如下:
#define ENDSTRING '\0'
int StrLen(char *string)
{
int len=0;
while(*string++ != ENDSTRING)
len++;
return len;
}
编写主函数main.c 如下:
#include<stdio.h>
extern int StrLen(char* str);
int mian(void)
{
char src[]="Hello Dymatic";
printf("string length is: %d\n",StrLen(src));
return 0;
}
编译:gcc -o test string.c main.c
生成:test
执行结果:string length is: 13
也可先生成目标文件:gcc -c string.c main.c
编译:gcc -o test string.o main.o
4.预编译处理
使用gcc的 -E选项告诉编译器进行预编译操作。
编译:gcc -E string.c
生成:string.i
查看:cat string.i
结果如下:
# 1 "string.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "string.c"
int StrLen(char *string)
{
int len=0;
while(*string++ != '\0')
len++;
return len;
}
可以发现ENDSTRING已经被'\0'替换。
5.编译成汇编语言
编译:gcc -S string.c
生成:string.s
查看结果:cat string.s
如下:
.file "string.c"
.text
.globl StrLen
.type StrLen, @function
StrLen:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp)
jmp .L2
.L3:
addl $1, -4(%ebp)
.L2:
movl 8(%ebp), %eax
movzbl (%eax), %eax
testb %al, %al
setne %al
addl $1, 8(%ebp)
testb %al, %al
jne .L3
movl -4(%ebp), %eax
leave
ret
.size StrLen, .-StrLen
.ident "GCC: (GNU) 4.2.1"
.section .note.GNU-stack,"",@progbits
6.生成和使用静态链接库
生成静态库或者将一个obj文件加到已经存在的静态库的命令为" ar 库文件 obj1 obj2"。
将上面的string.o打包成库libstr.a命令如下:
ar -rcs libstr.a string.o
使用静态库如下:
gcc -o test main.c libstr.a 或 gcc -o test main.c lstr
应该你的运行会报错,没有找到lstr库,所以应该如下使用:
gcc -o test main.c -L ./ lstr //手动指定lstr库的位置。
7.生成和使用动态链接库
编译:gcc -shared -Wl,-soname,libstr.so -o libstr.so.1 string.c
选项中的soname表示别名为libstr.so,-o libstr.so.1表示实际名称为libstr.so.1,-shared表示生成ige动态链接库。
动态链接库的配置
动态链接库的搜索路径配置文件 : /etc/ld.so.conf
这个目录下存放可被linux共享的动态链接库所在目录名字,多个目录名间以空格 换行等空白字符 或是冒号或逗号隔开。
动态链接库管理命令:ldconfig
ldconfig的作用是在系统默认搜索路径,和动态链接库配置文件中所列出的目录里搜索动态链接库,创建动态链接装入程序需要的链接和缓存文件。搜索完毕将结果写入缓存文件/etc/ld.so.cache中,文件中保存的是已经安排好的动态链接库名字列表。
ldconfig -p //列出当前系统中的动态链接库
ldconfig -v //将扫描的动态链接库信息输出到终端
ldconfig 目录名 //将指定目录中的动态链接库放入系统中进行共享
使用动态链接库
编译:gcc -o test main.c -L./ -lstr
可能你的系统中test会报错,no such file or directory
程序编译时链接动态链接库和运行时使用动态链接库的概念不同。
运行时程序链接动态链接库需要在系统目录下才行。
有几种方法可解决此问题:
1.将动态链接库的目录放到程序搜索路径中,可加到环境变量LD_LIBARAY_PATH中实现。
LD_LIBARAY_PATH= /mydir: $LD_LIBARAY_PATH