最近项目windows下开发的差不多了,得知程序要最终在机器ARM板子上运行,所以需要我安个虚拟机,在乌班图下使用交叉编译工具链将程序交叉编译下。由于本人是第一次干这个,挺新鲜的,这里主要举例记录一下项目可执行程序.exe和lib库的交叉编译流程。欢迎共同交流。后续周末尽量全面的研究总结一下,再放上来。
一. 我在WindowsPC上,下载安装了Virtual Box最新版,免费小巧,新手使用,没必要用VM Ware;知乎有一位答主教程很不错,我按他来的,成功安装。附上教程地址:win10虚拟机Oracle VM Virtual Box安装和使用教程
然后安装Ubuntu,同样上述宝藏教程说的很详细,不多介绍,放一张安装好的图:
二. 然后就是交叉编译工具链的安装了,这里自取,也可以自行下载:
链接: https://pan.baidu.com/s/1C49LyC2rmO1Z90_Co98HpQ
提取码: a74h
这里说明一下本来打算自己安装工具链,结果同事给了一个.ova虚拟电脑自带了工具链,所以很简单我直接虚拟机导入这个虚拟电脑进去玩,真正工具链安装教程有时间总结,各位可查找别的教程。
这里我现成使用的是:
网盘给的是arm-linux-gnueabi, 版本4.6.4
有关这两个交叉编译器的区别,请看这一篇博客:贼鸡儿详细
① 在linux桌面home目录下,新建一个项目文件夹test;
② 在test文件夹下新建两个文件夹,分别为bin 和 test,bin将来放所生成的exe,test放具体的源代码及其他;
③ test——>test——>里新建一个build文件夹,存放编译该项目生成的一些文件,这些文件随时可删除,重新编译即可再次生成;新建一个src,功能自然是存放所有的cpp代码文件;新建一个CMakeLists.txt文件,这个是关键,里面要编写一些配置用于该项目编译。
tips:上述目录结构可类比windows下项目,便于理解:
# 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”)
简单介绍一下,几大块:
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程序路径名回车即可看到运行结果。
步骤一: 在build文件夹下右键打开命令窗口,输入 cmake ..(cmake和两个点之间空一格),此时类似于编译该解决方案,之后生成一堆文件如下图;
步骤二:再次输入 make 指令,将该项目编译生成exe或lib;
OK,大功告成。
时间仓促,先写这么多,后续有时间再补全~
=================================================
补充更新~
今天上来突然翻到一篇很棒很棒的博客,12万+阅读量足以说明一切。这么好的东西,当然要贴出来广为传播,也给自己留个传送门!
CMakeLists.txt语法介绍与实例演练