扩展:

  linux gcc命令

ar命令
  1. 描述:
       Linux系统的一个备份打包命令,用于创建归档文件(archive),或从归档文件中提取、添加、删除成员文件。
      ar命令最常见的用法是将目标文件(.o)打包为静态链接库(.a)。在嵌入式开发中经常用到。
  2. 命令格式:
      ar p [mod] 归档文件 [成员文件…]  
    p:必选参数,只能选一个
       –r:插入成员文件…存档(带替换)。此操作与q的不同之处在于,如果先前存在的成员名称与正在添加的成员的名称相同,则替换掉重名的成员文件。
       如果成员中有一个文件…不存在,ar将显示一条错误消息,并保留与该名称匹配的存档。任何现有成员不受干扰。
       默认情况下,新成员添加在文件的末尾;但是您可以使用其中一个修饰符abi来请求相对于某些现有成员的位置。
       –d:从存档中删除模块。指定要删除的模块的名称为成员…;如果没有指定要删除的文件,则存档将保持原样。如果指定了–v修饰符,ar会在删除模块时列出每个模块。
       –m:使用此操作移动归档中的成员。如果在多个成员中定义了符号,则存档中成员的顺序会影响程序使用库链接的方式。如果没有使用“m”修饰符,则将您在成员参数中指定的任何成员移动到存档的末尾;您可以使用a、b或i修饰符将它们移动到指定的位置。
       –p:将存档文件的指定成员打印到标准输出文件中。如果指定了v修饰符,在将该成员的内容复制到标准输出之前先显示成员名称。如果没有指定成员参数,则将打印归档文件中的所有文件。
       –q:快速追加。增加新模块到归档文件的结尾处。并不检查是否需要替换。‘a’,‘b’,或’i’选项对此操作没有影响,模块总是追加的归档文件的结尾处。如果加上–v选项则列出每个模块。 这时,归档文件的符号表没有更新,可以用’ar s’或ranlib来更新归档文件的符号表索引。
      注意:GNU ar中将命令qs作为r的同义词——替换存档中已经存在的文件,并在末尾附加新的文件。
       –x:从存档中提取成员(已命名的成员)。可以使用v修饰符来显示已提取成功的成员。如果不指定成员,则提取归档文件中的所有文件。
      注意:无法从无成员的存档文件中提取文件。
      更多信息参考man手册 
    mod:可选参数,可多选
       –c:创建存档。当您请求更新时,如果指定的归档文件不存在,则始终创建它。但是,除非预先指定要使用-c修饰符创建它,否则归档文件不存在将发出警告。
       –v:此修饰符请求操作的详细版本。当添加修饰符v时,许多操作都会显示附加信息,比如处理过的文件名。
       –u:通常情况下,ar r……将列出的所有文件插入存档。如果只想在列表中插入那些比同名的现有成员更新的文件,请使用此修饰符。u修饰符只允许用于操作r (replace)。特别是,不允许使用qu组合,因为检查时间戳会失去q操作带来的任何速度优势。
       –s:将成员文件索引写入存档,或更新现有索引,即使没有对存档进行其他更改。您可以在任何操作中使用此修饰符标志,也可以单独使用。在归档文件上运行ar -s相当于在其上面运行ranlib。
      更多信息请参考man手册
  3. 测试例程在结尾):
    a. 将库源文件编译成.o的目标文件–> gcc -c mylib.c -o mylib.o
    b. 将.o文件制作成静态库文件,静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。–> ar rcsv libmylib.a mylib.o
    c. 编译test.c 同时链接到已制作的静态库
      // -L库的路径(-L.表示当前目录) -l库名
      -->写法1: gcc -o test test.c -L. -lmylib //在gcc命令中默认使用共享库进行链接,在共享库找不到libmylib.a的库时,会在当前目录寻找。
      -->写法2: gcc -L. -o test test.c -Wl,-Bstatic -lmylib -Wl,-Bdynamic //由于程序里面使用了标准输入输出(stdio)的共享库,必须在命令行最后使用动态链接的命令才能正常连接,如果在这里没有加stdio.h的头文件,只使用自己制作的静态库libmylib.a ,只需要写成 gcc -L. -o test test.c -static -lmylib 就可以了。
  4. 静态库(.a)的特点:
    a. 静态库对函数库的链接是放在编译时期(compile time)完成的。
    b. 程序在运行时与函数库再无瓜葛,移植方便。
    c. 浪费空间和资源,因为所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。
    d. 在windows中静态库是以 .lib 为后缀的文件
  5. 动态库与静态库混合连接
       gcc -L. -o test test.c -Wl,-Bstatic -lmystaticlib -Wl,-Bdynamic -lmysharelib。这里需要保证动态链接放在后面,以让动态库(如标准库)能在默认的共享库路径去寻找共享库。也可以写成 gcc -L. -o test test.c -Wl,-Bdynamic -lmysharelib -Wl,-Bstatic -lmystaticlib -Wl,-Bdynamic。
  6. 测试例程:
    mylib.c 文件
int myplus(int a,int b);
	int mysub(int a,int b);
	int myplus(int a,int b)
	{
		 return a + b;
	}
	int mysub(int a,int b)
	{
		return a - b;
	}

test.c 文件

#include <stdio.h>
	int myplus(int a,int b);
	int mysub(int a,int b);
	int main(void)
	{
		int a,b;
	 	printf("请输入a和b:");
	 	scanf("%d%d",&a,&b);
		printf("%d + %d = %d\n",a,b,myplus(a,b));
		printf("%d - %d = %d\n",a,b,mysub(a,b));
		return 0;
	}