参考:https://blog.youkuaiyun.com/Q1302182594/article/details/44854207?utm_source=blogxgwz8
先在虚拟机里下载安装这些(推荐ubuntu,软件资源丰富一点)
sudo apt-get install libxml2 libxml2-dev bison flex libcdk5-dev cmake
1、下载libiio libxml2 libz源码
libiio下载:https://github.com/analogdevicesinc/libiio
libxml2下载:ftp://xmlsoft.org/libxml2/
libz下载:https://github.com/MiloszKrajewski/LibZ
2、交叉编译libxml2
https://blog.youkuaiyun.com/fanwenjieok/article/details/52848092
记录下生成的lib/*so文件路径,,后面会用到
3、交叉编译libz
https://www.cnblogs.com/Jacket-K/p/7374187.html
记录下生成的lib/*so文件路径,,后面会用到
4、创建文件:toolchainfile.cmake
交叉编译libiio,需要使用到cmake。cmake此时需要一个toolchainfile.cmake文件(改为其它名字也行),根据参考资料[2]的说明, 编辑toolchainfile.cmake的内容如下:
toolchainfile.cmake 最好放在libiio源码路径下
# this one is important
SET(CMAKE_SYSTEM_NAME Linux)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
# specify the cross compiler 这里添加交叉编译链工具的路径
SET(CMAKE_C_COMPILER/root/MYD-Y6ULX/Tools/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /root/MYD-Y6ULX/Tools/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)
# where is the target environment 这里最好把需要的这些文件的路径全部包含进去
SET(CMAKE_FIND_ROOT_PATH / /home/libiio/ /root/MYD-Y6ULX/Tools/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/ /home/libz/)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
#SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
#SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
5、在源码路径下创建config.sh脚本
#!/bin/bash TOOLCHAIN_PATH=/home/libiio/ cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_PATH}/toolchainfile.cmake .
说明:TOOLCHAIN_PATH是创建toolchainfile.cmake的目录。
6、执行./config.sh
可能会遇到下列问题
Could NOT find LibXml2 (missing: LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR)
问题:LIBXML2_INCLUDE_DIR
经过查看发现上述的两个目录中都没有libxml头文件,所以出现了missing:LIBXML2_INCLUDE_DIR的错误。
解决这个问题的办法有2种:
1)将ubuntu的libxml头文件路径添加到CMAKE_FIND_ROOT_PATH中;
2)注释掉下面的设定,使得cmake搜索头文件的路径不受限制:
#SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
问题:LIBXML2_LIBRARIES
经过查找发现/home/libxml2/中是包含有libxml库文件的。经过测试发现,libxml库的文件名(libxml2.so.2.8.0)有点问题。重新创建一个libxml2.so到libxml2.so.2.8.0的软连接,问题解决。在之后出现的PTHREAD_LIBRARIES问题,用同样的办法解决。
7、执行 cmake ./
问题:libxml2.so.2, needed by ../libiio.so.0.5, not found (try using -rpath or -rpath-link)
在指定的目录中已经包含了libxml2.so.2,但是这里却提示找不到!
解决方法1
将libxml2.so及其所链接的文件复制到libxml2源码目录中,然后再编译,即可通过。
解决办法2
在CMakeCache.txt中找到CMAKE_EXE_LINKER_FLAGS变量,将其值设为:
CMAKE_EXE_LINKER_FLAGS:STRING= -L/home/libxml2//lib -lxml2 -L /home/libz/lib -lz
8、make
如果报错:再检查一下CMakeCache.txt关于libxml2的一些路径,如果不是你交叉编译的路径都改过来。
9、make install
将生成三个*so文件
10、移植到arm板
将上面交叉编译的三个库生成的*so文件全部拷贝到板子的 /usr/lib/路径下。
检查一下格式是否为arm格式。
11、编写自己的应用程序的时候指定库路径
# -l指定静态库名字
LIB = -lpthread -lm -L/root/sqlite3 -lsqlite3 -lrt \
-L/home//libiio/libiio -liio\
-L/home/libxml2/lib -lxml2 \
-L/home/liblz/lib -lz