代码编织梦想

文件目录

├── main.c  
├── inc   
│ 	└── fun.h   
└── src   
	└── fun.c        

本地编译

cmake_minimum_required(VERSION 3.0.0)
project(my_test VERSION 0.1.0)

include(CTest)
enable_testing()

#设置编译工具链
set(TOOLCHAIN_DIR /usr)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/g++)

#设置编译的版本为debug版本。如果要编译realse版本,直接写realse即可
set(CMAKE_BUILD_TYPE Debug)

include_directories(${PROJECT_SOURCE_DIR}/inc)
aux_source_directory(./src SRC_LIST)
aux_source_directory(. SRC_LIST)
add_executable(my_test ${SRC_LIST})
set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin)#设置输出文件

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

交叉编译设置

cmake_minimum_required(VERSION 3.0.0)
project(my_test VERSION 0.1.0)

include(CTest)
enable_testing()

#设置编译工具链
set(TOOLCHAIN_DIR /opt/phytec-yogurt/BSP-Yocto-AM335x-PD19.1.1/sysroots/x86_64-phytecsdk-linux/usr/bin/arm-phytec-linux-gnueabi)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/arm-phytec-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/arm-phytec-linux-gnueabi-g++)
set(ARM_SYSROOT /opt/phytec-yogurt/BSP-Yocto-AM335x-PD19.1.1/sysroots/cortexa8hf-neon-phytec-linux-gnueabi)
#指定交叉编译环境的目录
set(CMAKE_FIND_ROOT_PATH "${ARM_SYSROOT}")
#从来不在指定目录(交叉编译)下查找工具程序。(编译时利用的是宿主的工具)
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)

set(CMAKE_CXX_FLAGS "-g -Wall -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=${ARM_SYSROOT}")
set(CMAKE_CXX_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")
set(CMAKE_C_FLAGS "-g -Wall -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=${ARM_SYSROOT}")
set(CMAKE_C_LINK_FLAGS "--sysroot=${ARM_SYSROOT}")
#设置编译的版本为debug版本。如果要编译realse版本,直接写realse即可
set(CMAKE_BUILD_TYPE Debug)

include_directories(${PROJECT_SOURCE_DIR}/inc)
aux_source_directory(./src SRC_LIST)
aux_source_directory(. SRC_LIST)
add_executable(my_test ${SRC_LIST})
set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin)#设置输出文件

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

添加外部库

动态库的添加:

link_directories(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径
target_link_libraries(project_name -lmxnet) #添加libmxnet.so
target_link_libraries(project_name -pthread -lm -ldl)#添加标准库

注意:link_directories()必须在add_executable()前,target_link_libraries()必须在add_executable()后面
静态库的添加:

add_library(mxnet STATIC IMPORTED)
set_property(TARGET mxnet PROPERTY IMPORTED_LOCATION /path/to/libmxnet.a)
target_link_libraries(project_name mxnet) #添加libmxnet.a

其他参考

# 指定要求cmake的最低版本
cmake_minimum_required(VERSION 3.0)

#设置交叉编译的环境
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

#指定交叉编译的gcc  g++。如果没有配置到环境变量,此处写绝对路径
set(CMAKE_C_COMPILER "arm-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "arm-linux-gnueabi-g++")

############## 以下几条可以不设置(实测可以),官方文档上步骤 ############
#指定交叉编译环境的目录
set(CMAKE_FIND_ROOT_PATH "/usr/local/arm_4.9.4/arm-linux-gnueabi")
#从来不在指定目录(交叉编译)下查找工具程序。(编译时利用的是宿主的工具)
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)
###################################################################

#设置C++ 编译的参数(根据需要自己设置)
set(CMAKE_CXX_FLAGS "-std=c++11 -DTEST -pthread -Wall -O0 -g3 -Wall  -fmessage-length=0 -fPIC")
set(CMAKE_C_FLAGS "-std=c99 -Wall -O0 -g3 -Wall -fmessage-length=0")
# -Wall       :  编译时显示警告信息
# -O          : 选择编译器优化的级别,-O0 不优化  -O1 -O2 -O3 不同程度的优化
# -g          :  生成调试信息,debug会用到。调试信息的级别。-g3 
#			    尽可能的生成gdb的可以使用的调试信息。默认为-g2。信息越多,编译出的程序越大。
# -std=c++11  : 编译所按照C++的标准
# -fmessage-length=0 :输出信息会根据控制台的宽度自动换行,这样就能看全输出信息了
# -fPIC       : 作用于编译阶段,告诉编译器产生与位置无关代码
#			    (Position-Independent Code)。加载到任意位置都能执行
# -DTEST	 : 设置TEST的宏定义,另外一种设置宏定义的方式可以直接使用 add_definitions(-D TEST) 添加

add_definitions(-D TEST2)	# 添加TEST2的宏

#设置编译的版本为debug版本。如果要编译realse版本,直接写realse即可
set(CMAKE_BUILD_TYPE "debug")  

# 程序所引用的头文件库目录。
include_directories(
    ${PROJECT_SOURCE_DIR}	# 当前工程的文件路径。如果需要其他库,要继续写所需要库的路径。
)

# 查找要需要编译的源文件。
# file函数将递归查文件夹及子文件夹下的所有.cpp 和 .c文件放到SRC中
# list函数排除build下面的.cpp和.c文件(在make过程中,会在bulid下面产生测试的cpp和c文件,避免冲突)
# 这样我们将所需要编译的源文件放到SRC中
# 有很多种搜索源文件的方法,感觉这是最省事的一种,其他可行百度
file(GLOB_RECURSE SRC *.cpp *.c)
file(GLOB_RECURSE SRC_EXPECT build/*.cpp build/*.c)
list(REMOVE_ITEM SRC ${SRC_EXPECT})


##################### 如果生成共享库 ########################
# 设置生成库的名字
set(LIB_NAME "test")
# 编译生成共享库
add_library("${LIB_NAME}"  SHARED  ${SRC})
# ${LIB_NAME} : 为库的名字
# SHARED :表示生成的是动态库。如果要编译成静态库替换成 STATIC 参数
# ${SRC} :需要编译的源文件

### 注意: 如果不是生成可执行文件,则不需要进行后续的连接动态库的操作。
###       在生成可执行可执行文件时,一块进行连接
###########################################################



#################### 如果生成可执行文件#####################
# 设置生成可执型文件的名字
set(SRC_NAME "test")
# 编译生成可执型文件
add_executable("${SRC_NAME}" ${SRC})
# ${SRC_NAME} : 生成可执型文件
# ${SRC} :需要编译的源文件

# 将可执行文件连接动态库,连接动态库的方式有很多,可以自行百度。
target_link_libraries("${SRC_NAME}" 
  	xxx.so			# 例如要连接xxx.so动态库
    )
###注意, 连接的多个动态库库如果有相互依赖关系,注意顺序,被依赖的库,
### 一定要放到前面。否则编译通过,放到设备上无法运行。
### 如果顺序有问题,实测会报BUSERROR或者一些其他的错误,很难定位
#############################################################

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32966261/article/details/127937389

交叉编译jsoncpp静态库_keer_zu的博客-爱代码爱编程_jsoncpp 交叉编译

许多实用cmake的开源项目在移植到其他平台时,还是比较麻烦的。 这里以jsoncpp为例。 首先,我本机的交叉编译工具及目录是: # which arm-linux-gnueabihf-gcc /root/board/tools/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin/

cmake基础及交叉编译_arrow的博客-爱代码爱编程

1. 概念 cmake 即编程cmake主要特点: 开放源代码,使用类 BSD 许可发布跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在苹果平台,可以生成 xc

在linux下使用树莓派交叉编译工具编译opencv库并进行移植_ett_qin的博客-爱代码爱编程_opencv移植 export ld_library_path

一、交叉编译opencv 继上一篇博客:“在Linux下配置opencv”之后,我以为直接将编译命令:g++ `pkg-config --cflags opencv` -o TestOpencv TestOpencv.cpp `pkg-config --libs opencv` 中的g++直接改成arm-linux-gnueabihf-g++就可以编译生

CMake 实例详解-爱代码爱编程

CMake 实例详解 CMake 是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的 Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写 Makefile 了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便,从而做到 “Write once, run everywhere”。 CMakeLi

<环境配置>——树莓派libmodbus编译使用实例-爱代码爱编程

1.安装编译 主要有最新版本和稳定版本3.0.6。最新版本编译较为简单,但是可能出现错误,实测树莓派4B出现部分错误仍然可以使用。 github地址: https://github.com/stephane/libmodbus  1.直接命令行下载: git clone git://github.com/stephane/libmodbus 2

linux下使用cmake交叉编译Android可以使用的动态库-爱代码爱编程

linux下小试cmake linux下小试cmake2 linux下使用cmake构建静态库和动态库 linux下,cmake如何使用外部共享库和头文件 linux下cmake练手小实例 linux下使用cmake交叉编译Android可以使用的动态库 一、使用NDK、Cmake交叉编译可以在android上使用的动态库 在NDK16版本以

Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)-爱代码爱编程

Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399 (一) 前言:交叉编译的OpenCV自带的GUI在ARM开发板上由于GTK的支持问题很难用自身的GUI显示界面,故配合交叉编译QT用于界面的设计和GUI显示,参考了一些微博,做记录及回顾之用,也能让后人少走些弯路,全程都亲测可行。 一、

libfacedetection库的配置及基本使用——内涵(cmake编译libfacedetection库)-爱代码爱编程

文章目录 前言一、libfacedetection库是什么?1.1、libfacedetection库的定义:1.2、如何使用libfacedetection库:1.3、获libfacedetection安装包的渠道:二、在vs2019中配置libfacedetection库:2.1、打开你的libfecetection解压的文件夹:2.1、打开v

一文详解CMake编译工具与项目构建-爱代码爱编程

1.C/C++的编译过程   编译过程实际上就是将一种语言(通常为高级语言)翻译为成另一种语言(通常为低级语言)。C/C++程序编译的主要工作流程为:源代码 → 预处理器 → 编译器 → 汇编器 → 链接器 → 可执行程序. (1)预处理   C/C++中,在编译器对源程序进行编译之前,首先要对程序文本进行预处理。预处理器提供了一组预编译处理指令和预

linux ndk编译c 项目,NDK在Linux下载配置以及C、C++编译配置(交叉编译)-爱代码爱编程

前言: 我们搭建好Ubutu虚拟机之后,通过xShell远程登录Ubutu上SSH服务器,在xShell上可以进行相关的编译操作了。但是我们在xShell上gcc、g++编译的可执行文件只能在Linux上执行,但是我们需要编译出来的东西可以在Android端使用,这就需要进行交叉编译,在Ubutu上编译出Android可执行的文件以及动态库。在编译之

linux用cmake编译,CMake使用简介(forLinux)-爱代码爱编程

cmake [选项] cmake [选项] 因为source 目录在../  所以指定../为源码目录。 -G:指定构建系统,当前只想创建Linux/Unix系统标准Makefile。所以指定为Unix Makefile. 具体支持何种构建系统:man cmake 可以看到类似入下内容: Generators The followi

android交叉编译ffmpeg,Mac上交叉编译ffmpeg For Android-爱代码爱编程

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 介绍通过mac os系统编译给Android平台上可以使用的ffmpeg静态库。 [TOC] shell脚本 编译ffmpeg的时候,需要在命令行上,配置编译的路径以及设置不同的属性值,如果一个个命令行输入的话,很容易出错,出错的时候修改后所有命令重新输出也麻

linux编程 —— vscode 开发编译 CMakeList.txt 学习笔记-爱代码爱编程

文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。 笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。 如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。 作者:Aliven888 1、简介   cmake 是一

CMake编译工具与项目构建-爱代码爱编程

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 文章导读 本文从C/C++代码的编译过程入手,弄清楚Make与Makefile,CMake与CMakeLists的关系,最后从CMakeLists的语法规则入手给出示例带大家熟悉如何编写一份简单的编译脚本。 1.C/C++的编译过程 编译过程实际上就是将一种语言

CMake及交叉工具编译链的安装使用-爱代码爱编程

1. 原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库。交叉编译,是利用交叉编译工具链,在宿主机器执行编译、链接生成目标机(嵌

详解cmake编译工具与项目构建_fdsgydf的博客-爱代码爱编程

cmake 1 C/C++的编译过程 编译过程实际上就是将一种语言(通常为高级语言)翻译为成另一种语言(通常为低级语言)。C/C++程序编译的主要工作流程为:源代码  → 预处理器  → 编译器  → 汇编器 → 链接器  → 可执行程序 (1)预处理 C/C++中,在编译器对源程序进行编译之前,首先要对程序文本进行预处理。预处理器提供了一组预编

还在付费使用 xshell?我选择这款超牛逼的 ssh 客户端,完全免费_写代码的珏秒秒的博客-爱代码爱编程

分享过FinallShell这款SSH客户端,也是xiaoz目前常用的SSH客户端工具,FinalShell使用起来方便顺手,但令我不爽的是tab数量变多的时候FinalShell越来越卡,而且内存占用也比较高。 最近发现一款使用使用C语言开发的跨平台SSH客户端WindTerm,完全免费用于商业和非商业用途,没有限制。 所有发布的源代码(第三方目录除外