交叉编译,错误的爆发如海啸…
整整搞了我两天。之前简单的程序以及静态库交叉编译都成功了,我还沾沾自喜,没想到一涉及到大型项目,多重调用就GG。淦!
来说正题~
背景
手上的一个项目,有多个模块,每个模块有一堆类组成,这个模块还调用好多个静态库/动态库。需求是要把这个模块编译后也生成静态库来供一个main.exe调用。哦忘了,这一系列操作都是要交叉编译环境下的。交代完毕。
一. 交叉编译libzmq源码
传送门
这里提醒一下,有两点比较注意。
- 就是 ./configure修改配置这里:
host和target参数,内容一致, 必须确认和你的arm交叉编译工具链的前缀是一样的!而不是简简单单的arm-linux就可以。 比如我自己因为这个原因,重新编译了一下。 改成了arm-linux-gnueabihf
这个错误就是我第一次编译生成的库和其他生成的库不是一个编译器,导致无法识别该库。
- 就是libzmq在第二次重新编译时,前面步骤不变,但是如果./configure没有修改 –prefix参数,仍然和第一次在同一路径下保存生成的文件的话,会报一个错误:没有权限在该目录下创建文件。此时解决问题的办法:
修改–prefix参数,换一个路径就可以。
二. 交叉编译其它静态库
三. 项目链接静态库/动态库自己再生成静态库
贴上CMakeLists.txt内容:
# CMake最低版本要求
cmake_minimum_required(VERSION 2.8)
# 设置目标系统
set(CMAKE_SYSTEM_NAME Linux)
set(USER_PATH "/home/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux")
# 设置工具链目录
set(tools ${USER_PATH}/bin/arm-linux-gnueabihf-g++)
# 设置编译器位置
set(CMAKE_C_COMPILER ${USER_PATH}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${USER_PATH}/bin/arm-linux-gnueabihf-g++)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_FIND_ROOT_PATH ${USER_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# 项目信息
project(DataCollect)
# C++11支持
add_definitions(-std