Cmake学习

2023-11-19

Cmake学习

CMake调用boost的编译脚本

cmake_minimum_required(VERSION 3.14)
project(boost_python)
#设置支持C++11特性
set(CMAKE_CXX_STANDARD 11)
#指定boost根目录
set(BOOST_ROOT E:/local/boost_1_61_0)
#设置不适用系统的的boost的库
set(BOOST_NO_SYSTEM_PATHS ON)
#设置使用静态的boost库
set(Boost_USE_STATIC_LIBS ON)
#查找boost库
find_package(Boost COMPONENTS thread system REQUIRED)

#如果已经找到
if(Boost_FOUND)
	MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
    MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
    MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
    MESSAGE( STATUS "Boost_LIBRARY_DIRS = ${Boost_LIBRARY_DIRS}.")
    include_directories(${Boost_INCLUDE_DIRS}
						${CMAKE_CURRENT_SOURCE_DIR}/3Party/websocketpp-master)
    link_directories(${Boost_LIBRARY_DIRS})
    add_executable(boost_python src/main.cpp)
    target_link_libraries (boost_python ${Boost_LIBRARIES})
endif()

常见命令学习

SET(SRC_LIST main.c)  #将.c文件设置到变量SRC_LIST里面,可以设置多个函数链接变量,

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #将生成的可执行文件放到build目录下的bin文件下
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) #将生成的lib库,放到build目录下的lib文件下。
set( CMAKE_BUILD_TYPE "Debug" )  # "REALEASE" 


${PROJECT_BINARY_DIR} #一般就是build目录下
${PROJECT_SOURCE_DIR} #就是CmakeLists.txt的同级目录。

ADD_SUBDIRECTORY(src )  #有多个目录的时候,每个目录都要写一个CmakeLists.txt文件,将这个文件包含进来。

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"..)
                      SATUS ,输出前缀为 — 的信息,  FATAL_ERROR,立即终止所有 cmake 过程, SEND_ERROR,
                      产生错误,生   成过程被跳过。
SHARED,动态库   STATIC,静态库   MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})  #生成库文件
SET(LIBRARY_OUTPUT_PATH   <路径>) #将生成的库放到指定路径下

#设置库文件的版本和多个同名字的库文件,还不是很懂!!
SET_TARGET_PROPERTIES,其基本语法是:
SET_TARGET_PROPERTIES(target1 target2 ...                               
														PROPERTIES prop1 value1   
														prop2 value2 ...)
#可执行文件链接库文件												
TARGET_LINK_LIBRARIES(main libhello.a)
#查看可执行文件链接的库文件
ldd mian   #main是可执行文件


#这条指令可以用来向工程添加多个特定的头文件搜索路径
1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件
     搜索路径放在已有路径的前面
 2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
include_directories(/usr/include/hello)  #这是绝对路径,可以配合CMAKE_INCLUDE_DIRECTORIES_BEFORE使用

#下面用来找特定路径的头文件和库文件,要在~/.bashrc里面设置路径
#如 export ASIO_ROOT="/home/jb/install/asio"
# 如 export  CMAKE_INCLUDE_PATH=“/home/include”
特殊的环境变量 CMAKE_INCLUDE_PATH 和 CMAKE_LIBRARY_PATH
#当然也是可以直接include_directories()绝对路径来查找,但是设置环境变量的方法比较智能,看起来高大尚,我刚#开始也是被搞懵逼了。

这里简单说明一下,FIND_PATH 用来在指定路径中搜索文件名,比如:
FIND_PATH(myHeader NAMES hello.h  PATHS /usr/include   /usr/include/hello)
FIND_PATH(myHeader hello.h)  #cmake会区会去~/.bashrc里面的路径查找哪个有hello.h的头文件,然后将该文件的路径给myHeader
IF(myHeader)   #如果找到路径
    INCLUDE_DIRECTORIES(${myHeader})  #那就包含进来。
ENDIF(myHeader)





CMAKE_INSTALL_PREFIX 变量类似于 configure 脚本的 – prefix,常见的使用方法看起来是这个样子:
  cmake -DCMAKE_INSTALL_PREFIX=/usr .   #/usr .代表要安装的目录,可以更改
  #常见的命令例子
  ARCHIVE 特指静态库,  LIBRARY 特指动态库,  RUNTIME特指可执行目标二进制
  INSTALL(TARGETS ${PROJECT_NAME}                #可执行文件
                    RUNTIME DESTINATION bin                    #可执行文件的目录bin
                    LIBRARY DESTINATION lib                       #lib的目录lib
                    ARCHIVE DESTINATION libstatic           #动态库的目录libstatic
)
INSTALL(FILES COPYRIGHT README DESTINATION   doc/cmake/t2) #将文件COPYRIGHT README放到doc/cmake/t2目录下
INSTALL(PROGRAMS run.sh DESTINATION bin) #将sh文件放到bin目录下
INSTALL(DIRECTORY doc/ DESTINATION doc/cmake/t2) #将doc目录下的内容安装到doc/cmake/t2目录下

#执行
cmake -DCMAKE_INSTALL_PREFIX=/home/jb/install/Test
make
make install
1.CMAKE_SOURCE_DIR == PROJECT_SOURCE_DIR
2.CMAKE_BINARY_DIR == PROJECT_BINARY_DIR

3.CMAKE_CURRENT_SOURCE_DIR  #指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录。
4.CMAKE_CURRRENT_BINARY_DIR  #他指的是 target 编译目录。
5.CMAKE_CURRENT_LIST_FILE #输出调用这个变量的 CMakeLists.txt 的完整路径
6.CMAKE_CURRENT_LIST_LINE #输出这个变量所在的行

7,CMAKE_MODULE_PATH
#这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己
#编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理
#CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设
#置一下。比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
#这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

8.使用$ENV{NAME}指令就可以调用系统的环境变量了。
#比如
MESSAGE(STATUS “HOME dir: $ENV{HOME})
#设置环境变量的方式是:
SET(ENV{变量名})
1 ,BUILD_SHARED_LIBS
这个开关用来控制默认的库编译方式,如果不进行设置,使用 ADD_LIBRARY 并没有指定库
类型的情况下,默认编译生成的库都是静态库。
如果 SET(BUILD_SHARED_LIBS ON)后,默认生成的为动态库。

3,CMAKE_C_FLAGS
设置 C 编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
4,CMAKE_CXX_FLAGS
设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
在这里插入代码片
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cmake学习 的相关文章

随机推荐

  • Mybatis/Mybatis-Plus驼峰式命名映射

    目录 一 mybatis驼峰式命名 二 mybatisPlus默认开启驼峰命名映射 一 mybatis驼峰式命名 方法一 使用前提 数据库表设计按照规范 字段名中各单词使用下划线 划分 使用好处 省去mapper xml文件中繁琐编写表字段
  • 团队梯队人才培养模型,60页人才梯队建设与人才培养

    团队梯队人才培养模型 60页人才梯队建设与人才培养 果断收藏 今日头条 人才梯队建设与人才培养 目录 1 人才梯队建设理念 2 人才梯队建设路径 3 梯队人才培养内容与方法 团队总监以上人员管理不成熟的表现 1 无法从项目运作导向转变到战略
  • yolov5 deepsort 行人/车辆(检测 +计数+跟踪+测距+测速)

    功能 简介 实现了局域的出 入 分别计数 显示检测类别 ID数量 默认是 南 北 方向检测 若要检测不同位置和方向 需要加以修改 可在 count car traffic py 点击运行 默认检测类别 行人 自行车 小汽车 摩托车 公交车
  • C++开源序列化库:FStruct

    FStruct是一个用于C 对象 结构体 STL容器等 和json xml字符串之间进行转换的库 采用非入侵方式 无需在原有结构体上进行修改 目前支持基础类型 结构体 以及vector list deque set map等复杂数据类型的序
  • 【C语言】字符串函数介绍三(strstr、strtok、streeror)

    前言 之前我们用两篇文章介绍了strlen strcpy stract strcmp strncpy strncat strncmp这些函数 第一篇文章strlen strcpy stract 第二篇文章strcmp strncpy str
  • 2019年用户流失分析(五)——Python实现

    5 模型应用 选择4月份为正常状态的电视用户 计算他们的收视时长 收视在线天数 距最近一次收视时间 入网时长 用户主动办理次数和投诉与报障次数6个特征指标 利用构建好的用户流失模型预测5月份的用户流失情况 5 1 离网倾向阈值 在4月份为正
  • ThreeJS动态加载div标签

    思路 1 在页面中创建一个div标签 2 确定标签在三维场景中的三维位置 3 计算三维位置的屏幕坐标 4 在每一帧的渲染中都计算一下这个三维坐标的屏幕位置 并把屏幕位置赋给标签 具体实现 1 创建div标签 标签样式 tap positio
  • 脑电EEG代码开源分享 【4.特征提取-频域篇】

    往期文章 希望了解更多的道友点这里 0 分享 脑机接口 人工智能 的学习之路 1 1 脑电EEG代码开源分享 1 前置准备 静息态篇 1 2 脑电EEG代码开源分享 1 前置准备 任务态篇 2 1 脑电EEG代码开源分享 2 预处理 静息态
  • Linux 文件共享(两种方法)

    一 实验目的 快速掌握Linux文件共享 共享文件夹 的两种方法 1 通过虚拟机ubuntu在 mnt hgfs下的共享文件夹映射到物理机实现 2 通过物理机的映射网络驱动器连接到虚拟机ubuntu的共享文件夹实现 二 实验环境 工具软件
  • 《算法图解》——第八章 贪婪算法

    第八章 贪婪算法 1 简单的贪婪算法 每步都采取最优的做法 每步都选择局部最优解 2 背包问题 有些情况下 完美是优秀的敌人 如果你只需要找到一个大致解决问题的算法 贪婪算法挺不错 因为实现容易 结果与正确结果相当接近 练习8 1 你在一家
  • 一文了解Clickhouse

    ClickHouse是什么 ClickHouse是一个存储计算一体的工具 其与spark flink等大数据框架不同的在于它有自己的存储层 在数据压缩 存储上做了更多的优化 所以导致它在某些数据处理能力上比其他工具快上了不少 毕竟一般框架只
  • OpenWrt的SR9000有线网卡驱动

    SR9000芯片的有线网卡驱动可以直接使用kmod usb net CDC ether 若为编译 可采取如下措施 make menuconfig kernel module usb support kmod usb net CDC ethe
  • PAT (Basic Level) Practice 1033 旧键盘打字 Python

    根据题意 这道题让我们根据要求去除第二行输入的字符串中的部分内容 1 判断上档键是否损坏 以进行下一步处理 2 根据要求去除字符串中特定字符 3 sys模块 可用于大量输入的加速 4 operator 可用于运算时的加速 代码如下 impo
  • Eclipse搭建stm32+jlink开发环境全攻略(高级篇)

    Eclipse搭建stm32 jlink开发环境全攻略 高级篇 一 问题概况 通过初级篇的学习 我们知道了一个Eclipse工程的配置以及调试 貌似使用也没什么问题 然而 当我们抛弃掉Eclipse自带的工程模版是 也抛弃的他的一些其他的功
  • 机器学习:多分类的logistic回归

    机器学习 多分类的logistic回归 Multi Class Logistic 多分类的Logistic问题 它适用于那些类别数大于2的分类问题 并且在分类结果中 样本x不是一定只属于某一个类可以得到样本x分别属于多个类的概率 也可以说样
  • Unity3D【脚本】 按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板

    按键盘Esc弹出退出面板 确定退出游戏 取消关闭面板 效果图 脚本 using UnityEngine using System Collections public class Exit MonoBehaviour public Game
  • 【Xilinx】SynchronousInterruptHandler错误排查笔记

    SynchronousInterruptHandler错误排查笔记 一 ArmV8的异常处理 二 64位lscript ld的修改 三 asm vectors S的修改 四 SynchronousInterruptHandler函数解析 五
  • 一篇文章学会使用摩斯密码,简单易懂,你也可以使用“降维打击”

    阅读之前 大家请先看一行符号 看看大家能不能猜出这段符号所代表的含义 相信能看出这段符号含义的人还是占少数 没关系 通过阅读久见菌的这篇文章保证让你能看懂这是什么意思 摩尔斯电码的发明 上面这一串符号就是使用摩尔斯电码打出来的英语单词 摩尔
  • Latex特殊符号大全(高清)

    Latex符号大全 转载内容供自己阅读 原文 Latex特殊符号大全 高清
  • Cmake学习

    Cmake学习 CMake调用boost的编译脚本 cmake minimum required VERSION 3 14 project boost python 设置支持C 11特性 set CMAKE CXX STANDARD 11