博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
交叉编译库依赖问题的解决方法
阅读量:4055 次
发布时间:2019-05-25

本文共 2088 字,大约阅读时间需要 6 分钟。

在交叉编译移植程序的时候,我们常常会遇到这样的情况:要编译的程序依赖于某个动态/静态链接库。而这个库也需要我们编译移植。在编译没有别的依赖的链接库的时候很简单,设置好交叉工具链、目标架构就可以了。而在编译有依赖需求的程序的时候,我们常常遇到找不到头文件、找不到库文件的问题。很是烦人。

要解决这个问题,其实还是很容易的。只需要先编译安装好运行库,然后在编译有依赖需求的程序的时候,在编译参数里把目标板上的库路径、头文件路径分别通过-L、-I选项添加到工具链中即可。这样一来既不会影响目标板、编译宿主系统的正常运行,也不用每次手动把文件复制到工具链中造成污染(而且升级的时候也分不出来)。
用代码来说话:

export CFLAGS="-L/path/to/target/libs -I/path/to/target/headers"./configure [some options]make && make install

举例来说,假设我的目标系统是mini2440开发板(CPU是基于armv4t内核的S3C2440),工具链是CodeSourcery提供的GNU ARM/LINUX工具链。目标板的根文件系统位于/mini2440/root,要编译的程序是lighttpd,依赖于pcre。具体步骤如下:

  1. 移植pcre
    cd /tmp# 新建pcre、pcre-install目录,分别用于编译和安装pcremkdir pcre{,-install}# 下载解压wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.bz2tar xvf pcre-8.00.tar.bz2 -C ./pcrecd pcre/# 配置(启用unicode支持、设置host运行时系统为arm-none-linux-gnueabi,使configure猜出交叉编译工具链前缀)./configure --host=arm-none-linux-gnueabi --prefix=/ --enable-utf8 --enable-unicode-properties# 编译安装到临时目录/tmp/pcre-install# 由于是用于嵌入式,所以像文档这类东西就不要了。我们之需要将动态链接库和头文件留下make && make DESTDIR=/tmp/pcre-install installcp -rv ../pcre-install/lib/pcre.so* /mini2440/root/libcp -rv ../pcre-install/include/pcre.so* /mini2440/root/include
  2. 编译安装lighttpd
    cd /tmp# 新建lighttpd、lighttpd-install目录,分别用于编译和安装mkdir lighttpd{,-install}# 下载解压wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.25.tar.bz2tar xvf lighttpd-1.4.25.tar.bz2 -C ./lighttpdcd lighttpd/# 配置(启用unicode支持、设置host运行时系统为arm-none-linux-gnueabi,使configure猜出交叉编译工具链前缀)CFLAGS="-march=armv4t -I/mini2440/root/include -L/mini2440/root/lib"            ./configure --prefix=/ --host=arm-none-linux-gnueabi            --disable-FEATURE --disable-ipv6 --disable-lfs            --without-zlib --without-bzip2# 编译安装到临时目录/tmp/pcre-install# 由于是用于嵌入式,所以像文档这类东西就不要了。我们之需要将动态链接库和可执行文件留下make && make DESTDIR=/tmp/lighttpd-install installcp -rv ../lighttpd-install/lib/* /mini2440/root/libcp -rv ../lighttpd-install/sbin/* /mini2440/root/sbin

    这样就可以了

看上面的例子,最关键的地方,就是配置lighttpd的时候,在配置项目前的CFLAGS变量的设置。其实我们完全可以把他单独设置成环境变量,这样就不用每次编译东西都需要输入了。

export CFLAGS="-march=armv4t -I/mini2440/root/include -L/mini2440/root/lib"

转载地址:http://suqci.baihongyu.com/

你可能感兴趣的文章
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>