首页 > 其他分享 >cmake使用03:库链接

cmake使用03:库链接

时间:2024-07-05 15:57:48浏览次数:13  
标签:03 CMakeLists cmake MYMATH VERSION DIR txt 链接 Tutorial

目录如下:
./step3是我们的这个项目工程目录,./step3/MathFuncions/下存在第三静态库libMathFunciotns.a,提供mysqrt()函数。
r如何通过cmake传递宏给CMakeLists.txt以决定是否链接第三方库,源文件中是调用第三方库的mysqrt()还是标准库的sqr()

step3/--
      |---build
      |---MathFuntion/
            |---mysqrt.cxx
            |---MathFunctions.h
            |--CMakeLists.txt
      |---Tutorial.cxx
      |---TutorialConfig.h.in
      |---CMakeLists.txt

1.先看主CMakeLists.txt

点击查看代码
cmake_minimum_required(VERSION 3.10)

# 1.设置工程名和版本号。
#这将使得Tutorial_VERSION_MAJOR为1,Tutorial_VERSION_MINOR=0
project(Tutorial VERSION 1.0)

# 2.指定使用c++标准.必须位于所有add_**调用之前
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 3. 定义选项变量。必须位于configure_file()之前
# 选项变量是缓存变量,在该文件修改其值将不起作用。
# 只能通过cmake ../CMakeLists.txt -DUSE_MYMATH=OFF修改

option(USE_MYMATH "Use tutorial provided math implementation" ON)

# 4. 基于TutorialConfig.h.in生成 TutorialConfig.h
configure_file(TutorialConfig.h.in TutorialConfig.h)

#5. cmake 的if语句。USE_MYMATH变量的值有cmake -DUSE_MYMATH=OFF或ON控制
if(USE_MYMATH)
  # 子目录:为${CMAEK_CURRENT_SOURCE_DIR}/MathFunctions
  #  调用该函数将会调用子目录下CMakeLists.txt,输出文件在
  # 构建目录:${PROJECT_SOURCE_DIR}/MathFunctions/build
  add_subdirectory(MathFunctions ${PROJECT_SOURCE_DIR}/MathFunctions/build)
  list(APPEND EXTRA_LIBS MathFunctions)
  list(APPEND EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/MathFunctions )
endif()
message(EXTRA_LIBS=${EXTRA_LIBS},EXTRA_INCLUDES=${EXTRA_INCLUDES},BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS},USE_MYMATH=${USE_MYMATH},  
CMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH})



# 6.生成可执行文件
add_executable(Tutorial tutorial.cxx)

#7. 指定target的链接库名。这里为可执行文件Tutorial连接库${EXTRA_LIBS}。target也可为库文件。
# 
target_link_libraries(Tutorial PUBLIC  ${EXTRA_LIBS})

#8. 指定target的所需头文件的路径
target_include_directories(Tutorial PUBLIC
                           ${PROJECT_BINARY_DIR}
                           ${EXTRA_INCLUDES}
                           )

TutorialConfig.h.in如下:

#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
#cmakedefine USE_MYMATH

在./step3/build/是我们的构建目录,在该目录下执行cmake ../CMakeLists.txt -DUSE_MYMATH=ON
不仅在该目录下生成Cmakefile,还基于TutorialConfig.h.in修改生成TutorialConfig.h

  1. Tutorial_VERSION_MAJOR变量的值替换@Tutorial_VERSION_MAJOR@
  2. Tutorial_VERSION_MINOR变量的值替换@Tutorial_VERSION_MINOR@
  3. USE_MYMATH若为ON,#cmakedefine USE_MYMATH修改为#define USE_MYMATH。否则不定义#define USE_MYMATH
    ps:
    CMAKE_SOURCE_DIR:最顶层CMakeLists.txt所在目录
    CMAKE_BIN_DIR:cmake调用最顶层CMakeLists.txt的工作目录
    project_SOURCE_DIR:最近调用project()的CMakeLists.txt所在目录
    project_BIN_DIR:cmake调用最近调用project()的CMakeLists.txt的工作目录
    CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt的所在目录,这是当前CMakeLists.txt中文件名的路径
    CMAKE_CUREENT_BIN_DIR:当前CMakeLists.txt的构建目录
    eg:

标签:03,CMakeLists,cmake,MYMATH,VERSION,DIR,txt,链接,Tutorial
From: https://www.cnblogs.com/cppisshit/p/18285695

相关文章

  • 1055 - Expression #9 of SELECT list is not in GROUP BY clause and contains nonag
    MySQL8的默认sql_mode包含了only_full_group_by,如果想要sql不按照这模式做检查,可以设置当前session的sql_mode值不包含oly_full_group_by;全局修改则使用以下sql--全局配置session级配置则去掉GlobalSETGLOBALsql_mode='ANSI_QUOTES,STRICT_ALL_TABLES,STRICT_TRANS_TAB......
  • 【2024-07-03】多少才够
    20:00忽然你发现你的碗喜欢你的筷子;你的瓶子喜欢你的花;你的拖把喜欢你的地板;你的衣服喜欢你的柜子;而你的家人喜欢你。                                                 ......
  • 海思SD3403/SS928V100开发(14)WIFI模块RTL8821驱动调试
    1.前言芯片平台:海思SD3403/SS928V100操作系统平台:Ubuntu20.04.05【自己移植】WIFI模块:LB-LINK的RTL88212. 调试记录参考供应商提供的操作手册2.1lsusb查看设备2.2编译供应商提供的驱动2.2.1修改Makefile2.2.2编译报错解决办法:将Makefile中arm改成ar......
  • 读人工智能全传03分治策略
    1. 黄金年代1.1. 图灵在他发表的论文《计算机器与智能》中介绍了图灵测试,为人工智能学科迈出第一步做出了重大贡献1.2. 美国在第二次世界大战后几十年里计算机技术发展的特色,也是美国在未来60年内确立人工智能领域国际领先地位的核心1.3. 1955年,麦卡锡向洛克菲勒研究所撰......
  • C#基础2024.07.03
    目录1、字符串的常见方法 1.1Format(格式化)1.2IsNullOrEmpty(判断是否为null或空(""))和IsNullOrWhiteSpace(判断是否为null或空("")或"")1.3Equals(判断两个对象是否相等)1.4Contains(判断字符串中是否包含某个字符串)1.5Length(计算字符串的长度)1.6Substring(截取字符串)1.7I......
  • WEB03Maven&Mybatis
    maven基础Maven是apache提供的一个项目管理工具,它的作用就是管理项目介绍依赖管理依赖管理主要指的是项目怎样引入依赖包,maven会将所有需要的依赖包放在本地仓库中,然后每个项目通过配置文件引入自己所需要的那部分jar包在maven本地仓库中是按照什么结构存放的?我......
  • Solution - Atcoder AGC034F RNG and XOR
    考虑到这个边权是\(\oplus\),那么说明对于\((u,v)\),\(u\tov\)和\(v\tou\)的边权实质是相同的。那么对于\(0\tox\),就可以反过来,记录下对应的路径,从\(x\)开始走,那么第一次走到\(0\)的时候也就是从\(0\)第一次走到\(x\)的时候。于是就转化为了\(x\)为起点,第一次......
  • (一):小程序与服务器的链接
    首  原文写于18年5月,因不再想继续使用C站,现将主要文件迁移至博客园。文中涉及技术部分已相对过时,但依旧对初始web的小朋友具有一定参考价值,权且玩乐。环境  IDE:myeclipse,服务器容器Tomcat,服务端主要用servlet。创建servlet  小程序与服务器链接(前端和后端的交互)的基......
  • 记录--淘宝、京东复制好友链接弹出商品详情是如何实现的
    ......
  • 【web APIs】快速上手Day03(Dom事件进阶)
    目录WebAPIs-第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑注意事项-鼠标经过事件的区别两种注册事件的区别事件委托综合案例-tab栏切换改造其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动......