linux如何使用动态库
不论Win还是Linux,都存在静态库和动态库。软件开发过程中:1静态库是直接编译链接到二进制中的2动态库的链接是在运行时进行的,即运行时进行链接,并将符号导入到进程地址空间的但是,很多开发者仍然有一点是不知道的:动态库在系统内存中,是各个进程共享的,换句话说,在各个进程中,动态库是位于相同的系统物理内存地址中,但却不同的进程虚拟地址中。
但是,这是如何做到的呢?当然是要依赖一个外部的链接器来做。比如,在Linux中,应用程序启动时,需要动态链接的进程,通常代理给ldd来查找相应的so,并完成so文件到进程的虚拟地址空间的内存映射的。如此,so既然是文件,就可以在相同的物理内存中被各个进程所共享。使用动态库链接的方式,通过共享物理的内存映射方式,从而大大节省了众多只读库对系统物理内存的消耗。
Linux的动态库文件是以lib字样开头的.so文件,编译链接动态库有两个要点:一个是需要用L选项指定动态库的搜索路径,这个搜索路径是需要连接的so文件的大致路径,比如/usr/openssl/lib;另外还需要用l(这个是小写的L)选项指定动态库的名字,比如下面这条编译命令:gccohellohello.cL/usr/openssl/liblcrypto。1、linuxc++动态库调用c动态库函数先把.cpp编译成动态库,编译方法:g++*.cpp–fPIC–shared–olibtest.solibyourclib.so其中,*.cpp表示你的.cpp文件,你可以把它们一一列出,–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
2、go怎么在linux下调用动态库//script.gopackagescript//1//externinitDllfuncc_initDll(string,string)//externrunDllfuncc_runDll(string,map[string]interface{})stringvardataMapmap[string]interface{}//2funcInit(){dataMapmake(map[string]interface{})returnc_initDll()}funcRun(buf[]byte)string{str:string(buf)retStr:c_runDll(str。