标记。然后当应用程序在内存中执行时,运行时环境发现它调用了一个动态库中的库函数时,会去加载这个动态库到内存中,然后以后不管有多少个应用程序去调用这个库中的函数都会跳转到第一次加载的地方去执行(不会重复加载)。
也就是在运行时,会把库函数代码放入内存中,然后多个程序要用到库函数时,就从这段内存去找,而静态链接对于多程序就是重复使用库函数,比较占内存。
(1) gcc中编译链接程序默认是使用动态库的,要想静态链接需要显式用-static来强制静态链接。
(2) 库函数的使用需要注意3点:第一,包含相应的头文件;第二,调用库函数时注意函数原型;第三,有些库函数链接时需要额外用-lxxx来指定链接;第四,如果是动态库,要注意-L指定动态库的地址。
6.8、常见的两个库函数:<1>C库中字符串处理函数包含在string.h中,这个文件在ubuntu系统中在/usr/include中
字符串函数 如:memcpy(内存字符串复制,直接复制到目标空间)确定src和dst不会overlap重复,则使用memcpy效率高
memmove(内存字符串复制,先复制到一个内存空间,然后再复制到目标空间)确定会overlap或者不确定但是有可能overlap,则使用memove比较保险
memset strncmp
memcmp strdup
???? memchr strndup
strcpy strchr
strncpy strstr
strcat strtok
strncat 。。。
strcmp
<2> 数学函数:math.h 需要加 -lm 就是告诉链接器到libm中去查找用到的函数。
C链接器的工作特点:因为库函数有很多,链接器去库函数目录搜索的时间比较久。为了提升速度想了一个折中的方案:链接器只是默认的寻找几个最常用的库,如果是一些不常用的库中的函数被调用,需要程序员在链接时明确给出要扩展查找的库的名字。
链接时可以用-lxxx来指示链接器去到libxxx.so中去查找这个函数。
6.9、自制静态链接库:(1)第一步:自己制作静态链接库,首先使用gcc -c只编译不连接,生成.o文件;然后使用ar工具进行打包成.a归档文件库名不能随便乱起,一般是lib+库名称,后缀名是.a表示是一个归档文件
注意:制作出来了静态库之后,发布时需要发布.a文件和.h文件。
(2)第二步:使用静态链接库,把.a和.h都放在我引用的文件夹下,然后在.c文件中包含库的.h,然后直接使用库函数。
备注:
<1>.a 文件,前缀一定要加lib ,如 libzf.a ; 链接属性 -l(小L),表示库名,属性-L表示库的路径。所以:gcc cdw.c -o cdw -lzf -L ./include -I(大i) ./include
<2> 头文件“ ”表示外部自定义,如果没加路径属性,默认当前路径找,如果在其他文件夹下,必须用 -I(大i) 路径。c++ strchr函数用<>表示的头文件一种是在编译器下的
库文件找,第二种是自己定义的库文件找,但是要定义其路径。
<3> 在makefile文件中用到gcc/arm-gcc 那么在shell中就用相应的编译器 gcc/arm-gcc .
<4> nm ./include/libmax.a 查看max库的信息,有哪些 .o 文件 .o文件有哪些函数。
举例:makefile: arm-gcc aston.c -o aston.o -c
arm-ar -rc libaston.a aston.o
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-11.html
真买挣了买豪门的
利比亚
当时买养老金就好了