CMake交叉编译简单教程

2023-05-16

首先要安装cmaek

然后安装交叉编译链

一、CMake简介:

CMake是一个跨平台的安装(编译)工具,可以通过简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。

 

二、CMake命令

CMake的语句都写在一个叫做CMakeLists.txt的文件里。常见的CMake内置变量和命令如下:

https://blog.csdn.net/wzzfeitian/article/details/40963457/

 

查看已安装好的cmake版本,我安装的是3.11.1版本

三、具体编译使用

(1)在atest/t1下写一个简单的main程序和对应的CMakeLists.txt文件。

Main.c内容如下:

#include<stdio.h>

int main()

{

printf("hello from t1 mian!\n");

return 0;

}

 

CMakeLists.txt内容如下:

CMake_minimum_required(VERSION 3.11)

PROJECT(HELLO)

SET(SRC_LIST main.c)

ADD_EXECUTABLE(hello ${SRC_LIST})

 

进行编译:

cmake .       //指定的是CMakeLists.txt所在目录

make

./hello

 

验证,结果正确。

 

此时t1文件夹中多了几个文件:

也可以查看hello的属性

 

(2)t1中默认生成的是x86,我们也可以自己添加语句来选择

建立atest/t2文件夹,main.c和CMakeLists.txt文件,main.c文件内容不变

CMakeLists.txt如下

 

SET(CMAKE_SYSTEM_NAME Linux)

SET(CMAKE_C_COMPILER /home/amm/software/arm-2014.05/bin/arm-none-linux-gnueabi-gcc)

SET(CMAKE_CXX_COMPILER /home/amm/software/arm-2014.05/bin/arm-none-linux-gnueabi-c++)

 

PROJECT(HELLO)

SET(SRC_LIST main.c)

ADD_EXECUTABLE(hello ${SRC_LIST})

 

进行编译

cmake .

make

 

此时文件夹内容

再次查看hello属性

 

(3)t1 和 t2 都是内部编译,我们其实是不希望编译文件与源文件混在一起的,故建立build文件夹,使编译都在build文件夹内进行

#include<stdio.h>

 

int main()

{

printf("hello from t3 mian!\n");

return 0;

}

CMake_minimum_required(VERSION 3.11)

PROJECT(HELLO)

SET(SRC_LIST main.c)

ADD_EXECUTABLE(hello ${SRC_LIST})

 

此时进入build目录下进行编译

此时目录情况

Build中:

达到目的。

 (4)当有多个文件时main.c hello.c hello.h

//main.c

#include "hello.h"

int main()

{

hello("World");

return 0;

}

// hello.c

#include <stdio.h>

#include "hello.h"

 

void hello(const char* name)

{

printf("HELLO %s!\n",name);

}

//hello.h

#ifndef AMM_HELLO_

#define AMM_HELLO_

void hello(const char* name);

#endif

//CMakeLists.txt

project(A2)

set(SRC_LIST main.c hello.c)

add_executable(A2 ${SRC_LIST})

编译过程

(5)将hello生成库文件,只需要将CMakeLists.txt文件改一下:

project(A3)

set(LIB_SRC hello.c)

set(APP_SRC main.c)

add_library(hello ${LIB_SRC})

add_executable(A3 ${APP_SRC})

target_link_libraries(A3 hello)

编译过程一样,可以看到在build文件夹中多了.a静态库文件

(6)将源文件、库文件分别放入src和libhello不同文件夹中,并将生成的可执行文件放入build/bin中,生成的库文件放入build/lib中

需要写三个CMakeLists.txt文件,A5中,libhello中,src中

// A5中的CMakeLists.txt

CMake_minimum_required(VERSION 3.11)

project(A5)

 

add_subdirectory(src)

add_subdirectory(libhello)

// libhello中的CMakeLists.txt

set(LIB_SRC hello.c)

add_library(libhello ${LIB_SRC})

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")

// src中的CMakeLists.txt

include_directories(${PROJECT_SOURCE_DIR}/libhello)

set(APP_SRC main.c)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

add_executable(A5 ${APP_SRC})

target_link_libraries(A5 libhello)

进行编译

观察后相应文件在相应设定的文件夹中

此时生成的是.a静态库,如果想生成动态库,则改动一下libhello中CMakeLists.txt文件

将第二行中加入SHARED就生成的是动态库了

四、其他

例如如何加入第三方库,没找到合适的例子

通过上边的语句应该可以达到目的。

 

后来补充:

例如:

有现成的lib库为libqueue.a和其对应的头文件queue.h

  1. 建立main文件,和写对应的CMakeLists.txt文件

//main.c

  1. #include "queue.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. int main()
  7. {
  8. sp_queue q = init();
  9. void* x = (void*)"abc";
  10.  
  11. //void* x = (void*)99;
  12.  
  13.  
  14. push(&q,x);
  15. printf("入队元素为:%s\n",x);
  16.  
  17. printf("队列长度:%d\n",size(q));
  18.  
  19.  
  20. pop(&q, &x);//出队列
  21. printf("出队:%s\n", x);
  22.  
  23.  
  24. return 0;
  25. }

//CmakeLists.txt

cmake_minimum_required(VERSION 3.11)

 

project(testQ)

set(INK_DIR /home/amm/atest/testQ)

set(LINK_DIR /home/amm/atest/testQ)

set(SOURCE_FILES main.c)

 

include_directories(${INK_DIR})

link_directories(${LINK_DIR})

add_executable(testQ main.c)

target_link_libraries(testQ libqueue.a)

 

2.进入终端,在空文件夹build下:

Cmake ..

Make

./testQ

 

可以发现,成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake交叉编译简单教程 的相关文章

随机推荐

  • DSP28335笔记 ———— 中断系统 之 外部中断

    DSP28335笔记 中断系统 之 外部中断 我用的开发板是 硬汉DSP28335开发板 xff0c 文中对于硬件的描述可以说是没有 xff0c 而且我还没有附上电路图希望在看的朋友不要喷我 然后 xff0c 我个人感觉普中的DSP2833
  • DSP28335笔记 —— 定时器

    DSP28335笔记 定时器 相比于STM32 xff0c DSP28335的定时器好像真的简单了好多 xff0c 从定时器个数来讲只有3个 xff0c 时钟源只能是系统时钟 xff0c 而且计数方向也只有向下计数 单纯且善良的定时器 xf
  • C语言线程基本函数

    学习笔记 xff1a C语言线程基本函数 学习内容 xff1a 线程常用基本函数 xff1a pthread create 创建线程pthread exit 退出当前线程pthread join 等待其他线程结束pthread self 自
  • 《大话设计模式》笔记——简单工厂模式

    前言 我 xff08 长胖的阿诏 xff09 是新入行的嵌入式程序员 xff0c 所以用C语言做示例演示 xff0c 我看到书上都是 C 语言的代码 xff0c 所以我只能先领会精神 xff0c 再通过C语言复刻 在我的资源里好像没有见过用
  • 《大话设计模式》笔记——策略模式

    策略模式 34 我 34 的理解 策略模式 是指同一个对象在不同情况下的策略行为有所差异 xff0c 继续以之前的四则运算为例 加 减 乘 除 就是两个参数在不同情况下计算过程的差异性行为 所以在某种程度上 xff0c 策略模式可能比简单工
  • md文件目录生成器

    md文件目录生成器 目录 md文件目录生成器 md文件目录生成器 step1 下载脚本文件 step1 下载脚本文件 step2 生成脚本文件 step2 生成脚本文件 step3 设置环境变量 step3 设置环境变量 step4 可以用
  • Python __file__ 详解

    这个功能纠结了一下午 xff0c 做了测试以后总算是明白了 file 表示显示文件当前的位置 但是 xff1a 如果当前文件包含在sys path里面 xff0c 那么 xff0c file 返回一个相对路径 xff01 如果当前文件不包含
  • 48.HTTP基本认证与摘要认证

    文章目录 基本认证摘要认证 转载请注明原始出处 xff1a http blog csdn net a464057216 article details 52705855 后续此博客不再更新 xff0c 欢迎大家搜索关注微信公众号 测开之美
  • CircleProgressBar 圆形进度条,支持多种属性

    效果图 xff1a xff0c 直接从新项目里面摘出来的 xff0c 给自己做个记录 所以就不多加说明 xff0c 1 自定义控件 xff1a 网上摘录修改 public class CircleProgressBar extends Vi
  • c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网 xff0c 个人学习笔记 加上了mtianyan标签标记知识点 C语言入门 gt Linux C语言编程基本原理与实践 gt Linux C语言指针与内存 gt Linux C语言结构体 https www imooc co
  • GPS接收机(一)概述

    概述 接下来的几篇博客包括如下内容 1 xff0c 圆极化天线 xff1a 包括圆极化天线的设计 xff0c 场路协同仿真 xff08 电磁场和电路 xff09 xff0c 相位中心的计算 2 xff0c 低噪放 xff1a 包括低噪放的设
  • ERROR: invalid message type: fl_com/sensor_connect_state. If this is a valid message type, perhaps y

    ERROR invalid message type fl com sensor connect state If this is a valid message type perhaps you need to type rosmake
  • libcurl进行post

    libcurl进行post main函数 xff0c 初始化和清理curl 全局初始化curl curl global init CURL GLOBAL ALL std string url 61 34 http xxxx 34 std s
  • STL几个容器的比较

    vector xff1a 连续内存 xff0c 随机访问数据成员快 xff0c 但是频繁的插入 xff08 需要移动要插入的元素的后面的所有元素 xff09 或者扩容 vector扩容后会清掉原来的数据 xff0c 拷贝到新的申请的大的内存
  • STL注意问题

    1 由于继承的存在 xff0c 拷贝会导致分割 那就是说 xff0c 如果你以基类对象建立一个容器 xff0c 而你试图插入派生类对象 xff0c 那么当对象 xff08 通过基类的拷贝构造函数 xff09 拷入容器的时候对象的派生部分会被
  • CAN总线通信协议详讲

    CAN简介 CAN是Controller Area Network 的缩写 xff08 以下称为CAN xff09 xff0c 是ISO国际标准化的串行通信协议 由德国电气商博世公司在1986 年率先提出 此后 xff0c CAN 通过IS
  • gazebo仿真——controller配置(transmission/hardwareInterface标签)

    参考roswiki controller官方说明 本文作为古月大神的补充ROS探索总结 xff08 三十一 xff09 ros control 为了在gazebo中实现机器人关节的控制 xff0c 需要求建立一个controller控制器
  • NDK--CMakeLists配置第三方so库

    当我们创建一个NDK工程时 xff0c 会自动创建一个CMakeLists txt的文件 xff0c 在AS中c 43 43 的编译器是使用LLVM xff0c 规则为cmake xff0c 今天来学习下cmake的基本套路 首先 xff0
  • postman插件下载安装教程(详细)

    一 前言 postman是一款强大网页接口调试工具 xff0c 我们在平时开发过程中经常会使用到 xff0c 一般使用最多的是postman的客户端 xff0c 实际上postman在谷歌浏览器上也提供了插件 xff0c 可以不必要安装客户
  • CMake交叉编译简单教程

    首先要安装cmaek 然后安装交叉编译链 一 CMake简介 xff1a CMake是一个跨平台的安装 编译 工具 可以通过简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的 makefile 或者 project 文件 二 C