1. 创建ubinode_demo工程目录,在该目录下创建include、src、lib、dynamiclib、output、obj子目录,将xmlrpc头文件、静态库和动态库分别拷贝到include、lib、dynamiclib目录下。
2. 编写Makefile文件
3. 在src目录下创建并编辑源代码,并在include目录下编写相应头文件。
4. 执行make
(1)采用静态库编译
出现如下错误:
原因如下:
Makefile在写明其链接的静态库时,要严格按照其依赖关系,越是底层的库,越往后面写。在链接静态库库时,libxmlrpc_client.a依赖其他的库。
解决方法:
链接xmlrpc静态库时将 -lxmlrpc_client \移到最前面的位置。
(2)采用动态库编译
修改makefile文件中如下命令:
XMLRPCLIBS = -L$(DYNAMICLIBDIR) \
出现如下错误:
解决方法:删除makefile中此库的链接。
(3)查看由动态库生成的可执行文件的大小时,发现和静态库生成的可执行程序大小一样。
原因如下:
$(DEMOBIN):
$(CC) -o $(DEMOBIN) $(C_FILES) $(INCLUDES) $(CURLLIBS) $(CJSONLIBS) $(XMLRPCLIBS) -lm -lrt -lpthread -ldl
不同目录下同名的库,只取第一个,后面的同名库被忽略。即在编译链接时使用了CURLLIBS目录下的xmlrpc静态库。
解决方法:
$(DEMOBIN):
$(CC) -o $(DEMOBIN) $(C_FILES) $(INCLUDES) $(XMLRPCLIBS $(CURLLIBS) $(CJSONLIBS) -ldl -lm -lrt -lpthread
5 . 下载到设备运行程序
(1)静态库
将生成的可执行文件下载到设备,赋予执行权限运行程序。
(2)动态库
方法1:将动态库下载到设备的/usr/lib目录,将可执行文件下载到设备,赋予执行权限运行程序。
方法2:将动态库和可执行文件打包下载到设备,解压后进入目录,赋予执行权限运行程序。
6、动态库(.so)和静态库(.a)的区别:
1、Makefile在写明其链接的库时,静态库要严格按照其依赖关系,动态库则不用。
2、静态库被添加为程序的一部分使用,生成的可执行文件大。动态库只是说明要用到这个库,并没有包含库的内容,生成的可执行文件较静态库小,但运行时需要将所有的动态库下载到设备。
3、如果静态库重新编译,应用程序也要重新编译,不利于维护与更新;动态库是程序运行时加载的,所以只需更新动态库即可。