Welcome 微信登录

首页 / 操作系统 / Linux / Linux下静态库与动态库的生成与调用

首先,这里有3个概念,静态库,动态库.静态库:是程序在链接时将静态库拷贝到可执行文件里,即生成可执行文件后,即使删除静态库,可执行文件仍可正常执行。动态库:也叫共享库,程序只是在链接时在可执行文件时保存了该库的信息,可执行文件执行时候需要到LD_LIBRAY_PATH或者/etc/ld.so.config里指定的路径去寻找该库并加载调用,因此如果删除该库,可执行文件将无法正常执行。共享库还有一调用方法,使用dlopen和dlsym来获得方法指针,然后调用。下面先说说生成静态库和动态库的方法。1.静态库的生成方法:func1.cint func1(){return 100;}func2.cint func2(int a){return a * a:}test.c#include <stdio.h>int func1();int func2(int);int main(int argc, char* argv[]){printf("func1:%d/n", func1());printf("func2:%d/n", func2(20));return 0;}(1).编译func1.c和func2.c.gcc -c func1.c func2.c生成func1.o和func2.o(2).利用ar来归档生成静态库ar -rv libfunc.a func1.o func2.o生成了libfunc.a,这个libxxxx.a是linux里静态库文件的固定格式。这时可以将libfunc.a拷贝到系统的lib路径,比如/usr/lib.(3).编译test.c并链接libfunc.agcc -o test test.c -L. -lfunc这里-L.是指定库文件路径。我碰到个一个奇怪的问题,如果是gcc -o test -lfunc test.c -L.的话会报错找不到func1和func2,一定要把-l和-L放到test.c之后才能编译过,目前还没了解原因。C++生成静态库的方法是一样的。g++ -c func1.c func2.car -rv libfunc.a func1.o func2.og++ -o test test.c -L. -lfunca.如果C++里调用C的库,这时候函数声明要加上extern "C"就可以了,例如test.cpp#include <iostream>using namespace std;extern "C" int func1();extern "C" int func2(int);int main(int argc, char *argv[]){cout<<"func1:"<<func1()<<endl;cout<<"func2:"<<func2(20)<<endl;return 0;}然后同样用g++ -o test test.cpp -L. -lfunc可以调用C的库。b.如果是C调用C++生成的库,需要用C封装一下C++的库,然后再调用。添加一个文件adapter.cpp#include "func1.h"#include "func2.h"extern "C"{int func3(){return func1();}int func4(int a){return func2(a);}}test.c里改成#include <stdio.h>int func3();int func4(int);int main(int argc, char *argv[]){printf("func1:%d/n", func3());printf("func2:%d/n", func4());return 0;}
  • 1
  • 2
  • 下一页
Ubuntu下的日语词典Gjiten与gWaeiUbuntu 安装Gmail 客户端GmailWatcher相关资讯      Linux知识 
  • 时光总是太匆匆!Linux已经诞生23  (08/29/2014 14:12:03)
  • Linux虚拟文件系统之文件打开(sys  (02/14/2012 11:41:54)
  • 2012 年 Linux 峰会时间表  (02/14/2012 06:47:27)
  • 报告称当前 Linux 人才抢手 高薪也  (02/15/2012 06:35:56)
  • 解析企业为何选择Linux及其特别之  (02/14/2012 08:17:59)
  • Linux禁用字符闪烁的方法  (11/02/2011 10:28:25)
本文评论 查看全部评论 (0)
表情: 姓名: 字数