首页 > 其他分享 >CMake Professtional-1 Introduction

CMake Professtional-1 Introduction

时间:2024-05-17 19:40:49浏览次数:23  
标签:... CMake target Introduction library add 使用 Professtional 链接

the stage of cmake

600

Generating Project Files

choose a project generator: Ninja, Unix Makefiles, MSYS Makefiles

mkdir build
cd build
cmake -G "Unix Makefiles" ../source

# use --help can display the variable
cmake -G -h

building tool

cmake --build /some/path/build --config Debug --target MyApp

--config 可以在多配置 选项中选择自定义选项进行配置, 如 :Visual Studio 15 2017, Xcode
--target 指定 build 的 目标

最小 project

cmake_minimum_required(VERSION 3.2)
project(MyApp)
add_executable(myExe main.cpp)

project command

project(projectName
  [VERSION major[.minor[.patch[.tweak]]]]
  [LANGUAGES languageName ...]
)

可以添加多个 add_executable 用于测试等

executables

add_executable(targetName [WIN32] [MACOSX_BUNDLE]
  [EXCLUDE_FROM_ALL]
  source1 [source2 ...]
)

一些 keyword :

EXCLUDE_FROM_ALL 指定一些不需要 build 的project

defining libraries

the basic

add_library(targetName [STATIC | SHARED | MODULE]
  [EXCLUDE_FROM_ALL]
  source1 [source2 ...]
)

和 add_executable 类似

关键字:

  • STATIC : 静态库 windows: .lib, linux : .a
  • SHARED : 动态库 windows: .dll, linux : .so
  • MODULE : 和动态库类似但是动态加载.

可以直接使用命令指定类型

cmake -DBUILD_SHARED_LIBS=YES /path/to/source

也可以写入 CMakeLists.txt

set(BUILD_SHARED_LIBS YES)

CMake 中一些和不同类型的链接

  • PRIVATE : 当目标自身需要此链接库时使用
    • A 使用了 B 的库,其他和 A 链接的库,并不需要用到 B。
  • PUBLIC : 当目标自身或其他目标链接了这个目标时使用
    • 并仅仅是 A 使用了 B, 他的 interface 也使用了 B
    • 意味着 如果没有B, 那么 A 无法使用。
    • 任何使用了 A 的库 都必须使用 B 才可以运行
    • example : A 中定义的方法,其中至少有一个类型在 B 中定义或者实现。因此 使用 A 就必须使用 B。
  • INTERFACE : 当目标自身不需要此链接库,但其他目标链接了这个目标时使用
    • 为了使用 A, 部分 B 就需要被使用。
    • 和 PUBLIC 的区别是, A 本身不需要 B, 但是 A 的 interface 需要。
    • example : using a target to represent a header-only library’s dependencies
target_link_libraries(targetName
  <PRIVATE|PUBLIC|INTERFACE> item1 [item2 ...]
  [<PRIVATE|PUBLIC|INTERFACE> item3 [item4 ...]]
  ...
)

使用这个命令来处理库和库之间的关系

add_library(collector src1.cpp)
add_library(algo src2.cpp)
add_library(engine src3.cpp)
add_library(ui src4.cpp)
add_executable(myApp main.cpp)
target_link_libraries(collector
  PUBLIC ui
  PRIVATE algo engine
)
target_link_libraries(myApp PRIVATE collector)

ui PUBLIC 链接 collector, 因此 虽然 myApp 只链接 collector , 但也链接这 ui。
algo and engine PRIVATE 链接 collector, 因此 myApp 并不直接链接他们。

这种方法可以解决循环依赖。

不指定 目标 链接

指定 path to library file

CMake may ask the linker to search for the library instead (e.g. replace /usr/lib/libfoo.so with -lfoo)

Plain library name

If just the name of the library is given with no path, the linker command will search for that library (e.g. foo becomes -lfoo or foo.lib, depending on the platform). This would be common for libraries provided by the system.

Link Flag

As a special case, items starting with a hyphen other than -l or -framework will be treated as flags to be added to the linker command. The CMake documentation warns that these should only be used for PRIVATE items, since they would be carried through to other targets if defined as PUBLIC or INTERFACE and this may not always be safe.

一些建议

  • 目标名称不需要和项目名称相同。
  • 命名不需要以 Lib 开头
  • 除非有强烈理由,否则尽量避免在知道需要之前为库指定STATIC(静态)或SHARED(共享)关键字。这允许在选择静态库或动态库作为整个项目范围的策略时具有更大的灵活性。可以使用BUILD_SHARED_LIBS变量在一个地方更改默认设置
  • 在使用 target_link_libraries()命令时 , 推荐使用关键字。

标签:...,CMake,target,Introduction,library,add,使用,Professtional,链接
From: https://www.cnblogs.com/bigsharker/p/18198473

相关文章

  • cmakelist的一个例子
    一个例子,仅做参考用: CMAKE_MINIMUM_REQUIRED(VERSION3.12)set(ProjName"NetworkTest")project(${ProjName})string(FIND${CMAKE_CURRENT_BINARY_DIR}"/"pos0REVERSE)MATH(EXPRpos0${pos0}+1)string(SUBSTRING${CMAKE_CURRENT_BINARY_DIR}${po......
  • 第一章:Introduction to Interconnection Networks
    第一章:互联网络介绍数字系统三个基本组件逻辑(logic)存储(memory)通信(communication)随着技术进步,当前大部分数字芯片系统的瓶颈在于通信,组件之间的通信偏绿远远落后于处理器时钟频率,因此互联是未来数字系统成功的关键因素。关于互联网络的三个问题什么是互联网络互连网络是......
  • Cmake打印信息
    messageLogamessage.SynopsisGeneralmessagesmessage([<mode>]"messagetext"...)Reportingchecksmessage(<checkState>"messagetext"...)Generalmessagesmessage([<mode>]"messagetext"...)......
  • windows下源码编译CMake项目
    Cmake项目1、安装路径和源码安装包下载地址:https://cmake.org/download/源码地址https://github.com/Kitware/CMake2、编译源码下载后会有一个CMake-master的文件夹在里面新建一个build目录打开cmake-gui可执行文件出现cmake的界面,设置source路径为刚刚的CMake-......
  • [Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。
    前言最近在开发一个组件,但是这个东西是以dll的形式发布的界面库,所以在开发的时候就需要上层调用。如果你是很懂CMake的话,ui_xx.h的文件目录在$下然后除了有关这个ui_xx.h,还有一些别的可以简单聊聊的一、父子工程组织,或者说依赖关系在使用CMake进行开发的时候,一般可以有......
  • SystemVerilog -- 11.0 Introduction
    SystemVerilogAssertions系统的行为可以写成一个assertion,该assertion在任何时候都应该为真。因此,assertion用于验证定义为属性的系统的行为,也可用于功能覆盖。Whatareproperitiesofadesign?如果assertion检查的设计属性未按预期方式运行,则assertion将失败。例如,假设设......
  • 一个CMake的例子
    首先编写4个文件:1、CMakeLists.txt内容:cmake_minimum_required(VERSION3.15)project(Demo)include_directories(${PROJECT_BINARY_DIR}/headers)aux_source_directory(${PROJECT_BINARY_DIR}/sourcesSRC_DIR)add_library(dynamic_librarySHARED${SRC_DIR})add_libr......
  • CMake中里的find_package与find_library有什么区别?
    在CMake中,find_package和find_library都是用来找到和链接库的方法,但它们的用法和适用场景略有不同。find_package主要用于寻找具有CMake配置文件的库,这些库通常遵循CMake的规范,提供了用于导入目标、库路径、头文件路径等的配置文件。这使得使用find_package更加简洁,只需指定需......
  • 【cmake】find_package设置查找路径
     1.find_package的作用与实例用来查找第三方依赖包的.cmake文件,并根据.cmake文件生成依赖包的头文件目录和库文件路径等;CMakeLists.txt实例find_package(ProtobufREQUIRED)include_directories(${PROTOBUF_INCLUDE_DIR})add_executable(mainsrc/main.cpp)target......
  • CMakeLists.txt --- install使用
    例:cmake_minimum_required(VERSION3.9)project(test)set(CMAKE_BUILD_TYPEDebug)add_library(hahatest.cpp)install(TARGEThahaDESTINATION/home/linxisuo/project/test)install(DIRECTORY${CMAKE_SOURCE_DIR}/testDESTINATION/home/linxisuo)说明:1.安装......