CMakeLists.txt 相关工作

cmake_minimum_required(VERSION 3.15)
project(test)
set(CMAKE_CXX_STANDARD 11)
set(SRC add.cpp test.cpp div.cpp)
set(EXECUTABLE_OUTPUT_PATH /home/dabing/aa/bb/cc)
add_executable(app ${SRC})

#搜索PROJECT_BINARY_DIR参数里的文件cpp .c ,将文件存入SRC变量中,PROJECT_BINARY_DIR是CMakeLists.txt的路径
aux_source_directory(${PROJECT_BINARY_DIR} SRC)

##CMAKE_CURRENT_BINARY_DIR是CMakeLists.txt的路径,找CMAKE_CURRENT_BINARY_DIR路径下的cpp文件
file(GLOB SRC ${CMAKE_CURRENT_BINARY_DIR}/*.cpp)


#实例,文件结构{CMakeLists.txt, build, include, src},利用CMakeLists.txt编译src文件夹下的cpp等文件
#


cmake_minimum_required(VERSION 3.15)
project(test)
#aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#指定头文件的路径
include_directories(${PROJECT_SOURCE_DIR}/include)
add_executable(app ${SRC})


#通过CMake制作动态库、静态库
add_library(库名称 STATIC/SHARED [源文件1][源文件2])
#====制作动态库==动态库有可执行权限===
cmake_minimum_required(VERSION 3.15)
add_library(calc SHARED ${SRC})

#====制作静态库====
add_library(calc STATIC ${SRC})

#指定动态、静态库的输出路径 LIBRARY_OUTPUT_PATH
cmake_minimum_required(VERSION 3.15)
set(LIBRARY_OUTPUT_PATH /home/dd/xx/rr)
add_library(calc SHARED ${SRC})


#使用制作的动态、静态库
#首先发布库,需要发布两个库:库文件和函数声明文件
#CMake的链接静态库的命令
#静态库名称可以是掐头、去尾的名字
link_libraries(<静态库名称> [<静态库名称> ...])
#指定静态或动态库的路径
link_directories(<lib_path> [<lib_path>])

cmake_minimum_required(VERSION 3.15)
project(test_link_libraries)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include)
link_libraries(calc)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
add_executable(app ${SRC})

#=========================================================

#CMake链接动态库
target_link_libraries(
    <target>
    <PRIVATE/PUBLIC/INTERFACE> <item>
)
#target:指定要加载动态库的文件的名字
#       可以是源文件
#       可以是动态库文件
#       可以是可执行文件
#权限是链接库的权限,public是默认权限,动态链接库有传递性,private只能传递一次,
#PUBLIC:在pulbic后边的库会被link到前边的target中,并且里边定义的函数等也会被导出,提供给第三方使用
#PRIVATE:在private后边的库仅被link到前边的target中,并且终结掉,第三方不能感知你调了啥库
#INTERFACE:在interface后面引入的库不会被链接到前边的target中,只会导出定义的函数
cmake_minimum_required(VERSION 3.15)
project(test_link_libraries)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include)
link_libraries(calc)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
#动态库的directory
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib2)
add_executable(app ${SRC})
#动态库链接要写在最后,因为动态库是在可执行程序调用才会加载动态库
target_link_libraries(app calc)

#========================================================================

#message 日志
message([STATUS][WARNING][AUTHOR_WARING][SEND_ERROR][FATAL_ERROR] "message to display" ...)
#(无):重要消息
#STATUS:非重要消息
#AUTHOR_WARING:CMake 警告
#SEND_ERROR:CMake 错误,继续执行,但会跳过生成的步骤
#FATAL_ERROR:CMake错误,终止所有处理过程

cmake_minimum_required(VERSION 3.15)
project(test_link_libraries)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include)
message("XXXXXXXXXXXXXXXXXXXXXXX")
link_libraries(calc)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
message(STATUS "XXXXXXXXXXXXXXXXXXXXXXX")
#动态库的directory
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib2)
message(FATAL_ERROR "XXXXXXXXXXXXXXXXXXXXXXX") #会终止make执行
add_executable(app ${SRC})
#动态库链接要写在最后,因为动态库是在可执行程序调用才会加载动态库
target_link_libraries(app calc)


#=====================================================================
#字符串拼接,使用${}将变量中的字符串取出
set(变量名 ${变量名1} ${变量名2} ...)

set(tmp hello world)
set(tmp1 ${tmp} ${SRC})
message(${tmp})
message(${tmp1})
#================================================
#字符串追加,list是变量
list(APPEND <list> [<element> ...])

list(APPEND tmp "xxx1" "sss2" ${SRC})
message(${tmp})
#===================================================
#字符串移除,删除某一个子字符串,拼接后的字符串以;分割,删除的字符串要全部匹配
list(REMOVE_ITEM <list> [<value> ...])
#删除子字符串main.cpp
list(REMOVE_ITEM SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
#========================================================

#获取列表的长度,
list(LENGTH <list> <output variable>)
#LENGTH:指定命令类型,获取列表长度
#<list>:当前操作的列表
#<output variable>:新创建的变量,用于存储列表的长度。



#==========================================================
#读取列表中指定索引的元素,可以指定多个索引
list(GET <list> <element index> [<element index> ...])
#<list>:当前操作的列表
#<element index>:列表元素的索引,从0开始编号;
#索引可以为负数,-1表示列表最后一个元素,-2为倒数第二个;索引超出列表长度会报错
#<output variable> 新创建的变量,存储指定索引元素的返回结果
#==========================================================
#将列表中的元素用连接符连接成一个新字符串
list(JION <list> <glue> <output variable>)
# list: 当前操作的列表
# glue: 指定的连接符
# output variable:新创建的变量,存储返回的字符串
#============================================
#查找列表是否存在指定元素,若没有找到则返回-1
list(FIND <list> <value> <output variable>)
# list: 当前操作列表
# value: 需要在列表搜索的元素
# output variable:新创建的变量

#========================================
#在列表中指定的位置插入若干元素
list(INSRT list <element_index> <element> [<elelment> ...])

#=========================================
#将指定索引的元素从列表中移除
list(REMOVE_AT <list> <index> [<index> ...])

#=================================================
#移除列表中的重复元素
list(REMOVE_DUPLICATES <list>)

#===========================================
#列表翻转
list(REVERSE <list>)

#===========================================
#列表排序
list(SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
#COMPARE:指定排序方法。STRING:按照子母顺序排序;FILE_BASENAME:使用basename排序;MATURAL:s使用自然数排序
#CASE:指明是否大小写敏感。SENSITIVE:按照大小写敏感方式排序,默认值;INSENSITIVE:按照大小写不敏感方式排序
#ORDER:指明排序的顺序。ASCENDING:按照升序排序,默认;DESCENDING:按照降序方式排序


#================================================================
#自定义宏
add_definitions(-D<宏>)

#================================================================
#CMakeLists文件嵌套
add_subdirectory(source_dir)
#source_dir 是指子CMakeLists所在位置的目录

  

posted @ 2023-07-16 21:41  FigureOut  阅读(34)  评论(0)    收藏  举报