首页 / 操作系统 / Linux / GCC在Linux编译时的简单用法
1.单个文件编译编写源文件hello.c编译:gcc hello.c生成a.out指定生成文件名:gcc -o test hello.c生成test2.编译成目标文件编译: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 " "
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
",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.o4.预编译处理使用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++ != " ")
len++;
return len;
}
可以发现ENDSTRING已经被" "替换。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,"",@progbits6.生成和使用静态链接库生成静态库或者将一个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共享的动态链接库所在目录名字,多个目录名间以空格 换行等空白字符 或是冒号或逗号隔开。动态链接库管理命令:ldconfigldconfig的作用是在系统默认搜索路径,和动态链接库配置文件中所列出的目录里搜索动态链接库,创建动态链接装入程序需要的链接和缓存文件。搜索完毕将结果写入缓存文件/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