Ubuntu下交叉编译工具链的使用记录(基于C++)

1. 前言

最近项目windows下开发的差不多了,得知程序要最终在机器ARM板子上运行,所以需要我安个虚拟机,在乌班图下使用交叉编译工具链将程序交叉编译下。由于本人是第一次干这个,挺新鲜的,这里主要举例记录一下项目可执行程序.exe和lib库的交叉编译流程。欢迎共同交流。后续周末尽量全面的研究总结一下,再放上来。

2. 准备

一. 我在WindowsPC上,下载安装了Virtual Box最新版,免费小巧,新手使用,没必要用VM Ware;知乎有一位答主教程很不错,我按他来的,成功安装。附上教程地址:win10虚拟机Oracle VM Virtual Box安装和使用教程
然后安装Ubuntu,同样上述宝藏教程说的很详细,不多介绍,放一张安装好的图:
在这里插入图片描述
二. 然后就是交叉编译工具链的安装了,这里自取,也可以自行下载:

链接: https://pan.baidu.com/s/1C49LyC2rmO1Z90_Co98HpQ
提取码: a74h

这里说明一下本来打算自己安装工具链,结果同事给了一个.ova虚拟电脑自带了工具链,所以很简单我直接虚拟机导入这个虚拟电脑进去玩,真正工具链安装教程有时间总结,各位可查找别的教程。

这里我现成使用的是:

arm-linux-gnueabihf

网盘给的是arm-linux-gnueabi, 版本4.6.4

有关这两个交叉编译器的区别,请看这一篇博客:贼鸡儿详细

3. 编译生成arm可执行exe及lib库

exe程序生成举例:

① 在linux桌面home目录下,新建一个项目文件夹test;
② 在test文件夹下新建两个文件夹,分别为bin 和 test,bin将来放所生成的exe,test放具体的源代码及其他;
③ test——>test——>里新建一个build文件夹,存放编译该项目生成的一些文件,这些文件随时可删除,重新编译即可再次生成;新建一个src,功能自然是存放所有的cpp代码文件;新建一个CMakeLists.txt文件,这个是关键,里面要编写一些配置用于该项目编译。

tips:上述目录结构可类比windows下项目,便于理解:
在这里插入图片描述

重点!!! 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(test)
set(CMAKE_CXX_FLAGS “${CAMKE_CXX_FLAGS} -pthread”)

# C++11支持
add_definitions(-std=c++11)
add_definitions(-D_GLIBCXX_USE_NANOSLEEP)
# 添加头文件路径
include_directories(${CMAKE_CURRENT_LIST_DIR}/include)

# 添加源文件路径,并将其保存在变量source_path中
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src source_path)

# message(STATUS “${CMAKE_CURRENT_LIST_DIR}”)

# 生成Exe
add_executable(${PROJECT_NAME} ${source_path})

# 指定生成路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/…/Bin)

# 连接库文件
find_package(Threads)
target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})

# 开启调试信息
#set(CMAKE_BUILD_TYPE “Debug”)
#set(CMAKE_BUILD_TYPE “Release”)
#set(CMAKE_CXX_FLAGS_DEBUG “$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb”)

#set(CMAKE_CXX_FLAGS_RELEASE “$ENV{CXXFLAGS} -O3 -Wall”)

# 开启所有警告
#set(CMAKE_CXX_FLAGS “-Wall”)

简单介绍一下,几大块:

  1. 设置目标系统、设置工具链目录、设置编译器位置这三项配置,正是交叉编译核心所在,调用交叉编译器实现对项目的编译;
  2. 项目信息,project()括号里的正是你的项目名;
  3. 下面的set…-pthread这一行和C++11支持的两行,网上说是指定c++11支持必不可少的三项。
  4. 添加头文件路径,不用多说,后面跟着的/include是你的include文件夹位置,这里如果所有头文件和cpp文件放一块了,那么就没有include文件夹了;
  5. 生成exe和指定生成路径这两项互相关联,即生成的exe放在哪里,就是我们最初的bin文件夹下;
  6. 连接库文件指的是如果你的项目有用到别的库,那么这里要指向链接库路径
  7. 最后的开启调试信息和和所有警告是死的,嫌麻烦可以注释掉。

tips1:第5点如果是生成lib库,改为下面这几行:

# 指定生成路径
set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/…/lib)

# 生成静态库
add_library(${PROJECT_NAME} ${source_path})

target_link_libraries(${PROJECT_NAME} libpthread.a)

find_package(Threads)
target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})

tips2: CMAKE_CXX_FLAGS_指的是c++,如果是c,是CMAKE_C_FLAGS_
tips3:如果去掉CMakeLists.txt中的三大块有关工具链的配置,再次编译后,生成的程序就是可以在linux下运行的程序。此时命令行输入生成的exe程序路径名回车即可看到运行结果。

4. 命令行窗口编译生成

步骤一: 在build文件夹下右键打开命令窗口,输入 cmake ..(cmake和两个点之间空一格),此时类似于编译该解决方案,之后生成一堆文件如下图;
在这里插入图片描述

步骤二:再次输入 make 指令,将该项目编译生成exe或lib;
在这里插入图片描述

OK,大功告成。

时间仓促,先写这么多,后续有时间再补全~

=================================================

补充更新~

今天上来突然翻到一篇很棒很棒的博客,12万+阅读量足以说明一切。这么好的东西,当然要贴出来广为传播,也给自己留个传送门!

CMakeLists.txt语法介绍与实例演练

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值