博物馆网站模版,湖南营销型网站建设磐石网络,最便宜建站,腾讯微博做网站外链步骤1.什么是库 库是写好的现有的#xff0c;成熟的#xff0c;可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库#xff0c;不可能每个⼈的代码都从零开始#xff0c;因此库的存在意义⾮同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式#xff0c;可以被操作系统载…1.什么是库
库是写好的现有的成熟的可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库不可能每个⼈的代码都从零开始因此库的存在意义⾮同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式可以被操作系统载⼊内存执⾏。库有两种 静态库 .a[Linux]、.lib[windows]动态库 .so[Linux]、.dll[windows] 2.手动制作静态库 如果我们要做一个静态库的话首先我们需要把我们源文件(.c/.cpp)隐藏起来头文件(.h)必须暴露出来 1.我们先要把我们所有的.c文件编译成.o文件因为我们都知道我们正常进行程序翻译的时候首先要做的工作就是把.c变成.o文件最后把所有.o都链接起来。 2.把所以.o文件打包 指令ar -rc ar是 Unix 和类 Unix 系统下用于创建、修改和提取归档文件的工具 ar -rc是 ar命令的一个常用选项组合其功能如下 -rreplace该选项用于将文件替换或插入到归档文件中。如果归档文件中已存在同名文件-r选项会用新文件替换旧文件如果归档文件中不存在同名文件则将新文件插入到归档文件中。-ccreate用于创建一个新的归档文件。若指定的归档文件已存在-c选项不会报错而是静默处理使得ar -rc能够在归档文件不存在时创建新的归档文件存在时进行更新操作。 语法 ar [选项] 归档文件 目标文件... 归档文件指定要创建或修改的归档文件的名称通常具有.a扩展名如libexample.a。目标文件指定要添加到归档文件中的一个或多个源文件的名称可以是 C、C 源文件也可以是目标文件.o文件等。静态库必须有前缀lib后缀.a。 这个库制作好了直接把他安装到系统里面 把我们头文件拷贝到系统特定路径里Linux系统里默认搜索头文件路径是/usr/include 然后把我们库也要安装到系统里默认路径一般是/lib64/ 这样静态库和头文件都被安装到系统中去了所以Linux系统中所有的安装本质就是拷贝。 3.手动调用我们自己的静态库 然后试试别人能不能直接使用头文件中的方法 创建一个other目录 #includemy_stdio.h
#includemy_string.h
#includestdio.h
int main()
{const char *a abcdf;printf(%s: %d\n,a,my_strlen(a));myFILE *fp mfopen(./log.txt,a);if(fp NULL) return 1;mfwrite(a,my_strlen(a),fp);mfwrite(a,my_strlen(a),fp);mfwrite(a,my_strlen(a),fp);mfclose(fp);return 0;
} 为什么会链接报错呢 因为编译器找不到那同样是库那为什么那么多库能找到libc.aC语言的库呢为什么不要告诉编译器呢所以那是因为gcc是编C语言的他默认要认识C标准库的我们刚才写的库叫第三方库如何要让编译器认识刚才头文件和库都拷贝到系统都能被找到但是库有那么多究竟应该链接哪一个库呢所以 -l 这个l就是link(链接)然后库名libmystdio.a取掉前缀后缀就是stdio所以这样就能找到库并且能使用 -l就是引入指定名称的第三方库。 我们也可以不用把这些安装到系统里别人直接给我们提供了头文件和库这时我们该怎么使用呢 指令gcc main.c -o main -L. -lstdio -L 告诉编译器编译的时候查找库除了在系统路径下查找也要在指定路径下查找 gcc是 GNU Compiler Collection 的缩写是一个广泛使用的开源编译器套件支持多种编程语言这里主要用于编译 C 语言程序。main.c是要编译的源文件通常包含 C 语言的源代码。-o main-o选项用于指定输出文件的名称这里将编译后的可执行文件命名为main。如果不使用-o选项默认的输出文件名是a.out。-L.-L选项用于指定库文件的搜索路径。这里的.表示当前目录即告诉编译器在当前目录下搜索库文件。-lstdio-l选项用于指定要链接的库。这里的stdio是库的名称去掉lib前缀和.a或.so后缀编译器会在-L指定的路径这里是当前目录下搜索名为libstdio.a或libstdio.so的库文件并将其链接到可执行文件中。 所以我们把库写好了库里面应不应该有没有main函数 1.库里面绝对不能有main函数 如果库中也有main 函数那么在链接库到其他程序时就会出现多个main 函数这会导致链接错误因为程序不知道该从哪个main 函数开始执行。 2.库我们在发布的时候我们建议把所有的头文件放在include目录下把我们库放在lib64目录下。 通过makefile来制作静态库 libmystdio.a:my_stdio.o my_string.oar -rc $ $^
%.o:%.cgcc -c $
.PHONY:clean
clean:rm -f *.a *.o 发布我们写的库 指令tar tar是 Unix 和类 Unix 系统中常用的归档工具用于将多个文件或目录打包成一个归档文件也可以从归档文件中提取文件或目录。以下是关于 tar的详细介绍 基本功能 打包可以将多个文件和目录组合成一个单一的归档文件方便存储、传输和备份。压缩通常与压缩工具如gzip、bzip2等结合使用在打包的同时进行压缩减小文件占用的存储空间。解压从归档文件中恢复出原始的文件和目录结构。 常用命令选项 -ccreate创建新的归档文件。例如tar -cvf archive.tar file1 file2 dir1这会将file1、file2和dir1打包到archive.tar中。-xextract从归档文件中提取内容。例如tar -xvf archive.tar会将archive.tar中的文件和目录提取到当前目录。-tlist列出归档文件中的内容但不提取。例如tar -tvf archive.tar会显示archive.tar中包含的文件和目录列表。-ffile指定归档文件的名称。这个选项必须紧跟在-c、-x或-t之后后面跟上归档文件的路径和名称。-zgzip使用gzip进行压缩或解压。例如tar -czvf archive.tar.gz file1 file2会创建一个gzip压缩的归档文件archive.tar.gztar -xzvf archive.tar.gz会解压gzip压缩的归档文件。-jbzip2使用bzip2进行压缩或解压。例如tar -cjvf archive.tar.bz2 file1 file2会创建一个bzip2压缩的归档文件archive.tar.bz2tar -xjvf archive.tar.bz2会解压bzip2压缩的归档文件。 libmystdio.a:my_stdio.o my_string.oar -rc $ $^
%.o:%.cgcc -c $
.PHONY:clean
clean:rm -rf *.a *.o stdc
.PHONY:output
output:mkdir -p stdc/includemkdir -p stdc/libcp -f *.h stdc/includecp -f *.o stdc/libtar -czf stdc.tgz stdc 操作使用 然后怎么使用呢 gccGNU Compiler Collection 的缩写是一个广泛使用的编译器用于编译 C 语言等程序。main.c要编译的源文件其中包含了 C 语言的源代码。-o main-o选项用于指定输出文件的名称这里将编译后的可执行文件命名为main。如果不使用-o选项默认的输出文件名是a.out。-I stdc/include-I大写的 i选项用于指定头文件的搜索路径。这里告诉编译器在stdc/include目录下搜索main.c中#include指令所包含的头文件。例如如果main.c中有#include myheader.h编译器会在stdc/include目录中查找myheader.h文件。-L stdc/lib-L选项用于指定库文件的搜索路径。这意味着编译器会在stdc/lib目录下搜索后续-l选项指定的库文件。-l mystdio-l小写的 L选项用于指定要链接的库。这里的mystdio是库的名称去掉lib前缀和.a或.so后缀编译器会在-L指定的路径即stdc/lib下搜索名为libmystdio.a或libmystdio.so的库文件并将其链接到可执行文件main中。 4.手动制作动态库 动态库前缀也要加lib后缀加.so gcc/g不仅能形成可执行程序还能形成动态库 gcc -shared 用于生成共享库shared library在 Linux 和类 Unix 系统中共享库是一种可执行代码的二进制形式能被多个程序同时使用以节省内存并实现代码复用。 形成动态库时形成.o的过程要新增一个选项 -fPIC形成与位置无关码 -fPIC是 GCC 编译器中的一个重要选项全称为 “Position - Independent Code”即生成位置无关代码。以下从多个方面详细介绍它 1. 作用原理 在编译生成共享库shared library或可执行文件时程序的代码和数据在内存中的加载位置会影响指令的执行。传统的可执行文件在编译时代码中的内存地址引用是基于固定的加载地址计算的。但共享库比较特殊它可能被多个不同的程序加载到不同的内存地址空间运行。 -fPIC选项会让编译器生成的代码不依赖于特定的内存加载地址。编译器通过使用相对地址而不是绝对地址来引用数据和代码这样生成的代码可以在内存的任意位置加载执行而不需要在加载时进行重定位relocation。 2. 为何重要 共享库的需求共享库是为多个程序所共享的代码集合。如果没有-fPIC生成位置无关代码那么每个使用该共享库的程序在加载共享库时都需要对共享库中的代码进行重定位这不仅增加了加载时间而且还可能导致内存使用效率低下。通过-fPIC共享库可以在不同进程的地址空间中共享相同的物理内存页面极大地节省了内存资源。动态链接的基础现代操作系统普遍采用动态链接机制允许程序在运行时动态加载所需的共享库。-fPIC生成的代码使得动态链接过程更加高效和灵活能够适应不同的内存布局和加载场景。 libmystdio.so:my_stdio.o my_string.ogcc -o $ $^ -shared
%.o:%.cgcc -c $ -fPIC
.PHONY:clean
clean:rm -rf *.so *.o stdc 指令ldd ldd是一个在 Linux 和类 Unix 系统中非常有用的命令主要用于查看程序运行时所依赖的共享库shared libraries。 1. 基本语法 ldd [选项] 文件名 其中 文件名是要检查的可执行文件或共享库的名称选项可以用来获取更详细或特定格式的输出。 3. 常用选项 -v详细模式 提供更详细的信息包括共享库的版本号、加载的起始地址等。 4.输出解释 ldd 的输出通常包含以下信息 库名称这是程序或共享库所依赖的动态库的名称通常以 lib 开头以 .so 结尾。库的完整路径显示了动态库在文件系统中的实际位置。如果显示 not found表示该动态库未找到这可能会导致程序无法正常运行。库的地址显示了该动态库在内存中的加载地址。这通常在运行时由动态链接器分配对于大多数用户来说这个信息可能不太重要除非你正在进行一些系统级的调试。 3.如果把动态库删了可执行程序会怎么样 立即崩溃在某些情况下 - 如果可执行程序在启动时就需要加载被删除的动态库并且系统无法找到合适的替代库来满足依赖关系那么程序在启动阶段就会崩溃。例如一个程序依赖于一个特定版本的图形库来进行界面初始化当这个图形库动态文件被删除后程序在启动时尝试加载该库就会失败从而无法正常启动。 - 这是因为动态库中的函数和数据是在程序运行时按需加载的当找不到所需的动态库时操作系统无法完成程序的初始化过程 运行时出错 - 即使程序成功启动如果在运行过程中需要调用被删除的动态库中的函数也会出现错误。例如一个计算程序在运行过程中需要调用动态库中的数学计算函数当动态库被删除后一旦执行到调用该函数的代码部分就会出现 “无法找到动态库” 或 “无法解析符号函数名” 等错误。 - 这种情况通常会导致程序的部分功能失效或者直接崩溃具体取决于程序对该动态库的依赖程度以及如何处理动态库加载失败的情况。有些程序可能会有一定的错误处理机制能够在检测到动态库缺失时给出友好的错误提示并尝试恢复或继续执行其他功能但很多程序没有这样的机制就会直接异常终止。 如果把静态库删了可执行程序会怎么样 基本不受影响一般情况 - 当可执行程序链接了静态库后库中的代码和数据会在编译和链接阶段被复制到可执行文件中。所以在程序已经成功生成后删除静态库通常不会影响可执行程序的正常运行。 - 例如一个简单的 C 语言程序main.c链接了一个静态库libmath.a其中包含了一些数学计算函数来计算数值。在编译链接过程中gcc main.c -o main -L. -lmath假设库在当前目录下libmath.a中的相关代码被整合进了main这个可执行文件。之后即使删除了libmath.amain依然可以正常运行因为它已经拥有了运行所需的全部代码。 同时存在动静态库默认用的是动态库除非加 -static 一、默认使用动态库 编译时 在类 Unix 系统如 Linux中当同时存在一个库的静态版本例如 libexample.a和动态版本例如 libexample.so并且在编译链接可执行程序时没有特别指定使用静态库编译器通常会默认使用动态库。例如如果你有以下命令 gcc main.c -L. -lexample -o main这里 -L. 表示在当前目录查找库文件-lexample 表示链接 libexample 库编译器会优先使用 libexample.so如果存在因为这是默认行为。这是因为使用动态库可以节省磁盘空间和内存因为多个程序可以共享同一个动态库并且在更新库时只需要更新动态库而不需要重新编译程序。 二、使用静态库 使用 -static 选项 如果你想强制使用静态库可以使用 -static 选项。例如 gcc main.c -L. -lexample -o main -static此命令将强制编译器使用静态库 libexample.a 而不是 libexample.so 进行链接。这样最终生成的可执行程序将包含静态库的代码而不依赖于外部的动态库其优点是可执行程序的独立性更强可在不同环境中运行而不依赖于特定的库版本但缺点是可执行程序的体积会变大。 三、库搜索顺序 搜索顺序 编译器首先会搜索动态库。如果没有使用 -static 选项它会优先使用动态库。编译器会根据 -L 选项指定的路径查找库文件。如果没有使用 -L则会按照系统的默认库搜索路径查找通常包括 /usr/lib、/usr/local/lib 等。对于动态库系统会在运行时根据 LD_LIBRARY_PATH 环境变量、/etc/ld.so.conf 文件和系统默认的库路径来查找所需的动态库。 四、注意事项 库命名规则 静态库通常以 .a 结尾动态库通常以 .so 结尾在 Linux 系统中。库的名称通常遵循 lib库名.后缀 的格式例如 libexample.a 和 libexample.so。性能和空间权衡 动态库 优点多个程序可以共享同一个动态库节省磁盘空间和内存更新库时不需要重新编译程序。缺点可能存在兼容性问题如果库版本不兼容可能导致程序无法正常运行。 静态库 优点可执行程序不依赖于外部库可在不同环境中稳定运行。缺点可执行程序体积较大每个程序都包含一份库的副本。
文章转载自: http://www.morning.nrzkg.cn.gov.cn.nrzkg.cn http://www.morning.kkwbw.cn.gov.cn.kkwbw.cn http://www.morning.qkqhr.cn.gov.cn.qkqhr.cn http://www.morning.kfldw.cn.gov.cn.kfldw.cn http://www.morning.rgyts.cn.gov.cn.rgyts.cn http://www.morning.wcft.cn.gov.cn.wcft.cn http://www.morning.bgkk.cn.gov.cn.bgkk.cn http://www.morning.bpmtq.cn.gov.cn.bpmtq.cn http://www.morning.yggdq.cn.gov.cn.yggdq.cn http://www.morning.qflcb.cn.gov.cn.qflcb.cn http://www.morning.rpfpx.cn.gov.cn.rpfpx.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.hmgqy.cn.gov.cn.hmgqy.cn http://www.morning.gbxxh.cn.gov.cn.gbxxh.cn http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn http://www.morning.rdkqt.cn.gov.cn.rdkqt.cn http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.rckmz.cn.gov.cn.rckmz.cn http://www.morning.dwxqf.cn.gov.cn.dwxqf.cn http://www.morning.gcfrt.cn.gov.cn.gcfrt.cn http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn http://www.morning.gprzp.cn.gov.cn.gprzp.cn http://www.morning.jxdhc.cn.gov.cn.jxdhc.cn http://www.morning.sqgqh.cn.gov.cn.sqgqh.cn http://www.morning.lpzqd.cn.gov.cn.lpzqd.cn http://www.morning.mknxd.cn.gov.cn.mknxd.cn http://www.morning.pltbd.cn.gov.cn.pltbd.cn http://www.morning.hbhnh.cn.gov.cn.hbhnh.cn http://www.morning.fhddr.cn.gov.cn.fhddr.cn http://www.morning.qwmdx.cn.gov.cn.qwmdx.cn http://www.morning.qjxkx.cn.gov.cn.qjxkx.cn http://www.morning.fwkq.cn.gov.cn.fwkq.cn http://www.morning.jtrqn.cn.gov.cn.jtrqn.cn http://www.morning.qxycf.cn.gov.cn.qxycf.cn http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn http://www.morning.jwbnm.cn.gov.cn.jwbnm.cn http://www.morning.ryxdr.cn.gov.cn.ryxdr.cn http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.xqltq.cn.gov.cn.xqltq.cn http://www.morning.qfzjn.cn.gov.cn.qfzjn.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.qstkk.cn.gov.cn.qstkk.cn http://www.morning.tqqfj.cn.gov.cn.tqqfj.cn http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn http://www.morning.hyhzt.cn.gov.cn.hyhzt.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn http://www.morning.trrrm.cn.gov.cn.trrrm.cn http://www.morning.ybhrb.cn.gov.cn.ybhrb.cn http://www.morning.jypsm.cn.gov.cn.jypsm.cn http://www.morning.jqhrk.cn.gov.cn.jqhrk.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.tsdqr.cn.gov.cn.tsdqr.cn http://www.morning.xckdn.cn.gov.cn.xckdn.cn http://www.morning.dqkrf.cn.gov.cn.dqkrf.cn http://www.morning.lzsxp.cn.gov.cn.lzsxp.cn http://www.morning.ygqjn.cn.gov.cn.ygqjn.cn http://www.morning.rjmg.cn.gov.cn.rjmg.cn http://www.morning.wpsfc.cn.gov.cn.wpsfc.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.tdqhs.cn.gov.cn.tdqhs.cn http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.rqfnl.cn.gov.cn.rqfnl.cn http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.gwhjy.cn.gov.cn.gwhjy.cn http://www.morning.qbfkz.cn.gov.cn.qbfkz.cn http://www.morning.lcqrf.cn.gov.cn.lcqrf.cn http://www.morning.qnksk.cn.gov.cn.qnksk.cn http://www.morning.wyjhq.cn.gov.cn.wyjhq.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.zcqtr.cn.gov.cn.zcqtr.cn http://www.morning.mfrb.cn.gov.cn.mfrb.cn http://www.morning.kjxgc.cn.gov.cn.kjxgc.cn http://www.morning.smrkf.cn.gov.cn.smrkf.cn http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn http://www.morning.jphxt.cn.gov.cn.jphxt.cn http://www.morning.nj-ruike.cn.gov.cn.nj-ruike.cn http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn