linux库文件的制作
文件的路径加到-L参数里面,
把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面.如下面所示 gcc -o main -L/root/exercise main.o -ltest 此时就会生成一个名为main的可执行文件 另外,注意- l参数好象应该加到输入文件名的后面,否则会报错. 比如gcc -o main -L/root/exercise -ltest main.o就会提示 main.o(.text 0x11): In function `main'''': : undefined reference to `test'''' collect2: ld returned 1 exit status 原因我还不清楚:-) ⑷执行可执行文件查看效果 执行./main, 输出 test 说明执行成功.
四、动态库的编写 1、概述 动态库一般以.so结尾,就是shared object的意思. 其基本生成步骤为 ⑴编写函数代码 ⑵编译生成动态库文件,要加上 -shared 和 -fpic 选项 , 库文件名以lib开头, 以.so 结尾. 使用方式分为两种: 隐式调用和显示调用 隐式调用类似于静态库的使用,但需修改动态链接库的配置文件/etc/ld.so.conf; 显示调用则是在主程序里使用dlopen、dlsym、dlerror、dlclose等系统函数. 具体的调用方式会在 "五、动态库的调用" 中详细说明. 2、编写最简单的动态库文件 为了便于对照, 我们仍然采用静态库中的文件做例子. 编写如下两个文件,注意放在同一目录中 myalib.h //静态库头文件 myalib.c //静态库实现文件 //myalib.h 文件的内容 void test(); //myalib.c 文件的内容 #inlcude void test() { printf("testn"); } 3、编译生成动态库 ,库文件名以lib开头, 以.so 结尾. gcc -fpic -shared -o libtest.so myalib.c 此时就生成一个libtest.so文件 五、动态库的隐式调用 隐式调用的含义是代码里不出现库文件名,就是说这个代码和 调用静态库的代码是类似的. 1、编写测试文件 //main.c 测试动态库隐式调用的程序 #include "myalib.h" //要把函数的头文件包含进来,否则编译时会报错 int main(int argc,char* argv[]) { test(); return 0; } 2、 编译测试程序,与静态库类似,要把头文件的路径加到-I参数里面 gcc -I /root/exercise -o main.o -c main.c 现在生成了一个main.o文件 3、连接生成测试程序 gcc -o main -L/root/exercise main.o -ltest 现在生成了一个main文件 4、执行测试程序 ./main 此时出现提示 ./main: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory. 这个原因就是程序运行时并不知道动态库所在的路径,因此自然找不到. 解决这个问题的办法有三种.见下节 六、使动态库被系统共享的三种办法 (再次说明: 本节参考了计算机世界网雨亦奇的文章"LINUX动态链接库高级应用" 地址http://www.ccw.com.cn/htm/center/prog/02_3_13_3_2.asp) (1)拷贝动态链接库到系统共享目录下,或在系统共享目录下为该动态链接库 建立连接(硬连接或符号连接均可,常用符号连接).这里说的系统共享目录, 指的是LINUX动态链接库存放的目录,包括 /lib,/usr/lib以及/etc/ld.so.conf文件内所列的一系列目录. 实例:执行 # cp libtest.so /lib # ldconfig 或: # ln -s `pwd`/libtest.so /lib # ldconfig 注意pwd前后有两个反引号`,其目的是取得pwd命令的输出,即当前目录. 此时再执行main,即可成功. (2)将动态链接库所在目录名追 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |