Linux中交叉编译libiio
来源:互联网 发布:天下无贼 影评知乎 编辑:程序博客网 时间:2024/05/19 05:30
1 toolchainfile.cmake
交叉编译libiio,需要使用到cmake。而根据参考资料[1]中有关交叉编译的说明,cmake此时需要一个toolchainfile.cmake文件(改为其它名字也行),根据参考资料[2]的说明, 编辑toolchainfile.cmake的内容如下:
# this one is importantSET(CMAKE_SYSTEM_NAME Linux)#this one not so muchSET(CMAKE_SYSTEM_VERSION 1)# specify the cross compilerSET(CMAKE_C_COMPILER /home/liyihai/es/arago-2011.09/armv5te/bin/arm-arago-linux-gnueabi-gcc)SET(CMAKE_CXX_COMPILER /home/liyihai/es/arago-2011.09/armv5te/bin/arm-arago-linux-gnueabi-g++)# where is the target environmentSET(CMAKE_FIND_ROOT_PATH /home/liyihai/rootfs_v2.0 /home/liyihai/es/arago-2011.09/armv5te)# search for programs in the build host directoriesSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)#SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)# for libraries and headers in the target directoriesSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
为了方便编译,再创建一个config.sh脚本,内容如下:
#!/bin/bashTOOLCHAIN_PATH=/home/liyihai/es/arago-2011.09/armv5tecmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_PATH}/toolchainfile.cmake .说明:TOOLCHAIN_PATH是创建toolchainfile.cmake的目录。
2 missing: LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR
执行config.sh脚本即可配置libiio,然而事情当然没有那么顺利,提示错误如下:
Could NOT find LibXml2 (missing: LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR)其实,这个时候系统中已经有arm版的libxml2库了(编译方法见《Linux中交叉编译libxml2》),于是觉得应该是没有定义环境变量LIBXML2_LIBRARIES和LIBXML2_INCLUDE_DIR(但是实践证明,并不是这个原因。其实,就算你定义了上述两个环境变量也无济于事)。
在第1章中,指定了CMAKE_FIND_ROOT_PATH为/home/liyihai/rootfs_v2.0和/home/liyihai/es/arago-2011.09/armv5te两个目录,同时指定了CMAKE_FIND_ROOT_PATH_MODE_INCLUDE的值为ONLY,根据参考资料[2]的说明可知,这时cmake只会以上述两个目录为根目录来搜索头文件。
2.1 LIBXML2_INCLUDE_DIR
经过查看发现上述的两个目录中都没有libxml头文件,所以出现了missing:LIBXML2_INCLUDE_DIR的错误。
由于ubuntu系统中有libxml头文件,于是试图定义一个环境变量LIBXML2_INCLUDE_DIR,并且其值设为ubuntu中libxml头文件的目录,结果问题依旧!因为ubuntu中的libxml头文件目录不在cmake的搜索路径中,所以定义LIBXML2_INCLUDE_DIR也无济于事。
解决这个问题的办法有2种:a)将ubuntu的libxml头文件路径添加到CMAKE_FIND_ROOT_PATH中;2)注释掉下面的设定,使得cmake搜索头文件的路径不受限制:
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
2.2 LIBXML2_LIBRARIES
经过查找发现/home/liyihai/rootfs_v2.0中是包含有libxml库文件的。经过测试发现,libxml库的文件名(libxml2.so.2.8.0)有点问题。创建一个libxml2.so到libxml2.so.2.8.0的软连接,问题解决。在之后出现的PTHREAD_LIBRARIES问题,用同样的办法解决。
3 libxml2.so.2, needed by ../libiio.so.0.5, not found (try using -rpath or -rpath-link)
在指定的目录中已经包含了libxml2.so.2,但是这里却提示找不到!
3.1 解决方法1
将libxml2.so及其所链接的文件复制到libxml2源码目录中,然后再编译,即可通过。
3.2 解决办法2
在CMakeCache.txt中找到CMAKE_EXE_LINKER_FLAGS变量,将其值设为:
CMAKE_EXE_LINKER_FLAGS:STRING= -L/home/liyihai/rootfs_v2.0/usr/lib -lxml2 -L /home/liyihai/rootfs_v2.0/lib -lz上面指定了libxml2,libz两个库(libxml2依赖libz),并且指定其所在路径。重新使用make命令进行编译即可(make会自动调用cmake来解析CMakeCache.txt)
4 交叉编译libiio examples
需要修改原来的Makefile,如下所示:
TARGETS := ad9361-iiostream iio-monitorCFLAGS = -Wall -I ../ -I /home/liyihai/rootfs_build/includeLDFLAGS = -L ../ -L /home/liyihai/rootfs_v2.0/usr/lib -L /home/liyihai/rootfs_v2/lib -L /home/liyihai/rootfs_build/lib_oldCC=arm-arago-linux-gnueabi-gcc.PHONY: all cleanall: $(TARGETS)iio-monitor.o: iio-monitor.c# $(CC) -c -o $@ $^ $(CFLAGS)ad9361-iiostream.o : ad9361-iiostream.c $(CC) -c -o $@ $^ $(CFLAGS)iio-monitor: iio-monitor.o $(CC) -o $@ $^ $(LDFLAGS) -lpthread -lncurses -lcdk -liio -lxml2 -lzad9361-iiostream : ad9361-iiostream.o
提示:由上面的Makefile内容可知,iio-monitor依赖的库有lcdk,lz,lxml2和liio。其中lcdk的交叉编译见《Linux中交叉编译libcdk》,lxml2的交叉编译见《Linux中交叉编译libxml2》。
参考资料
[1]What is libiio?
[2]CMake Cross Compiling
[3]cmake的一些小经验
- Linux中交叉编译libiio
- Linux中交叉编译libcdk
- Linux中交叉编译ncurses
- Linux中交叉编译libxml2
- Linux中的libiio编程实践
- Linux kernel交叉编译
- LINUX交叉编译
- 交叉编译linux内核
- Linux 交叉编译
- Linux交叉编译总结
- Linux 交叉编译环境
- linux 模块交叉编译
- Linux交叉编译工具
- linux交叉编译环境
- 交叉编译Linux内核
- Linux中的交叉编译
- linux交叉编译
- ARM Linux 交叉编译
- jQuery 事件绑定(新版本)
- 编译技术,从BNF范式到文法识别简介
- Logistic Regression & softmax
- 冰川网络2015春招笔试题第四题
- 关于freemarker获取后台数值类型数据到前台出现逗号
- Linux中交叉编译libiio
- [LeetCode 65]Valid Number (通过率最低的一题)
- Android5.0挂载NTFS为只读问题
- Step-By-Step Guide to Get Started with Salesforce REST API using Java
- 关于面试官(3)
- JDBC批量操作
- PHP任意文件上传漏洞
- Android入门
- 写在最前面的