当前位置:首页 » 编程软件 » 动态库编译

动态库编译

发布时间: 2022-01-08 05:32:19

⑴ makefile 怎么写动态库编译

TARGET = client # 这里修改你的库名
TARGET_LIB = $(TARGET:%=lib%.a)

CROSSCOMPILER =#arm-hisiv200-linux-
CC = $(CROSSCOMPILER)gcc
AR = $(CROSSCOMPILER)ar
CFLAGS = #-DDEBUG
INCS = -I./
LIBS = -lpthread

SOURCES = main.c #这里添加你的c文件
OBJECTS = $(SOURCES:.c=.o)

all: $(TARGET_LIB) #$(TARGET) #修改这里可以更改编译目标

$(TARGET) : $(OBJECTS)
$(CC) -O2 -o $@ $(INCS) $(CFLAGS) $^ $(LIBS)
$(TARGET_LIB) : $(OBJECTS)
$(AR) -rv -o $@ $^

%.o:%.c
$(CC) -O2 -c -o $@ $(INCS) $(CFLAGS) $^
clean:
@rm -vrf $(TARGET) $(TARGET_LIB) $(OBJECTS)

#注意网络把tab自动删除了要补上

php动态库怎么编译

# 声称动代连接库,假设名称为libtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so

# 将main.c和动态连接库进行连接生成可执行文件
gcc main.c -L. -ltest -o main

# 输出LD_LIBRARY_PATH环境变量,一边动态库装载器能够找到需要的动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

# 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
ldd main

# 执行就不用说了吧

--------------------------------------------------
建议创建一个Makefile来作这些事情。

⑶ linux下,有几个.so。如何将这几个动态库编译成一个动态库

g++ -l*** -l*** -L 库目录. 一次g++ 是可以同时连接多个动态库的.不用把多个动态库编成一个.

⑷ 如何编译动态库,该动态库需要链接另外一个动态库

看你的makefile, 猜测是没有指定动态库头文件的路径. -I编译参数来指定

⑸ 动态库的编译


生成动态连接库,假设名称为libtest.so
gcc x.cy.cz.c-fPIC-shared-olibtest.so
将main.c和动态连接库进行连接生成可执行文件
gcc main.c-L.-ltest-omain
输出LD_LIBRARY_PATH环境变量,以便动态库装载器能够找到需要的动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
ldd main

⑹ 动态库链接编译

这里的动态的意思应该是模块代码是动态加载的
而不是随着应用程序一起编译
只要动态库里的函数接口不变
应用程序就无需重新编译
只需将动态库重新编译后替换掉旧的动态库即可
如果动态库的函数接口有变动
那么应用程序就要重新编译发布
这也是我的个人理解~~~

⑺ 缺少动态库的情况下,能通过编译吗

>> 如果你是链接动态库,在GCC后跟了一个-l参数,其后就是你所需库的名称,
>> 那么你不仅需要那个你所需的库文件,还需要你所需库的头文件才行,编译时需要头文件支持,
>> 链接时需要库文件,不管你是动态还是静态编译都是如此!!!!
头文件不是必须的。只要没有出现未声明的函数/变量的调用就可以。

>> 还需说明的一点是:只有用参数-o时才会有那个-satic的选项,
>> 也就是说只有在链接程序时才会有动态链接和静态链接之分!!!!!!
没有 -o 也可以 -static。-o 不代表链接

>> 动态链接库是为了减少可执行文件的大小,就是在一个系统中只提供一个库,
>> 可供多个动态链接的程序共同使用
同时也避免库代码被重复加载进入内存,减少系统内存占用

⑻ linux 静态库和动态库编译的区别

Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:

/* hello.c */
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc -c hello.c -o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序。
-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B

⑼ linux 编译怎么连接动态库

Linux的动态库文件是以lib字样开头的.so文件,编译链接动态库有两个要点:一个是需要用-L选项指定动态库的搜索路径,这个搜索路径是需要连接的so文件的大致路径,比如/usr/openssl/lib;另外还需要用-l(这个是小写的L)选项指定动态库的名字,比如下面这条编译命令:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto

⑽ linux动态库编译

Linux动态库的编译与使用 转载
http://hi..com/linuxlife/blog/item/0d3e302ae2384d3a5343c1b1.html
Linux下的动态库以.so为后缀,我也是初次在Linux下使用动态库,写一点入门步骤,以便以后能方便使用。
第一步:编写Linux程序库
文件1.动态库接口文件
//动态库接口文件getmaxlen.h
#ifndef _GETMAXLEN_H_
#define _GETMAXLEN_H_
int getMaxLen(int *sel,int N);
#endif
文件2.动态库程序实现文件
//动态库程序实现文件getmaxlen.c
#include "getmaxlen.h"
int getMaxLen(int *sel,int N)
{
int n1=1,n2=1;
for(int i=1;i<N;i++)
{
if(sel[i]>sel[i-1])
{
n2 ++;
if(n2 > n1)
{
n1 = n2;
}
}
else
{
n2 = 1;
}
}
return n1;
}
第二步:编译生成动态库
gcc getmaxlen.c –fPIC –shared –o libtest.so
由以上命令生成动态库libtest.so,为了不需要动态加载动态库,在命令时需以lib开头以.so为后缀。
–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
–shared:指明编译成动态库。
第三步:使用动态库
1. 编译时使用动态库
文件1.动态库使用文件test.c
//使用动态库libtest.so,该文件名为test.c
#include "getmaxlen.h"
int main()
{
int Sel[] = {2,3,6,5,3,2,1,2,3,4,5,6,7,6,5};
int m;
m = getMaxLen(Sel,15);
printf("%d",m);
return 0;
}
编译命令:
gcc test.c –L . –l test –o test
–L:指明动态库所在的目录
-l:指明动态库的名称,该名称是处在头lib和后缀.so中的名称,如上动态库libtest.so的l参数为-l test。
测试:
ldd test
ldd 测试可执行文件所使用的动态库
2. 动态加载方式使用动态库
文件内容:
//动态库的动态加载使用
int main()
{
void *handle = NULL;
int (*getMaxLen)(int *sel,int N);
int sel[] = {1,2,5,4,5,8,6,5,9,5,4,5,4,1};
handle = dlopen("./libtest.so",RTLD_LAZY);
if(handle == NULL)
{
printf("dll loading error.\n");
return 0;
}
getMaxLen = (int(*)(int *,int))dlsym(handle,"getMaxLen");
if(dlerror()!=NULL)
{
printf("fun load error.\n");
return 0;
}
printf("%d\n",getMaxLen(sel,15));
}
编译命令:
gcc –ldl test1.c –o test
gcc -o test test.c ./libmytools.so

热点内容
编译软件包 发布:2024-05-09 05:13:46 浏览:90
sql语句logon 发布:2024-05-09 05:04:28 浏览:556
阿里云服务器异地登录 发布:2024-05-09 05:04:27 浏览:933
信息发布源码 发布:2024-05-09 05:00:11 浏览:694
安卓手机aac是什么 发布:2024-05-09 04:56:21 浏览:394
数据库的中文乱码 发布:2024-05-09 04:41:00 浏览:751
永劫无间服务器为什么那么烂 发布:2024-05-09 04:34:38 浏览:811
用哪个软件配置华为企业路由器 发布:2024-05-09 04:23:58 浏览:521
简易脚本 发布:2024-05-09 04:17:30 浏览:802
返校vlog脚本 发布:2024-05-09 04:15:53 浏览:619