GCC在Linux编译时的简单用法

过儿古墓 2011-01-12

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

相关推荐