CMake手册
https://www.zybuluo.com/khan-lau/note/254724
CMake 入门实战:
https://www.hahack.com/codes/cmake/
https://blog.youkuaiyun.com/qq_15041569/article/details/90320555
Cmake项目管理工具的搭建与使用:
https://blog.youkuaiyun.com/lixiaogang_theanswer/article/details/73556226
https://www.jianshu.com/p/2eb8a8d7b2b0
if条件表达式:https://www.cnblogs.com/alexYuin/p/8874386.html
cmake 判断操作系统平台:https://blog.youkuaiyun.com/sean_8180/article/details/81189996
静态库与动态库:
https://www.cnblogs.com/zhoug2020/p/5904206.html
https://www.cnblogs.com/binbinjx/p/5626916.html
https://blog.youkuaiyun.com/b2259909/article/details/58591898
CMake编译如何解决[-Werror,-Wformat-security] 问题
add_definitions (-Wno-XXX)
如:add_definitions (-Wno-error -Wno-format-security)
一个完整例子
#指定需要CMAKE的最小版本
cmake_minimum_required(VERSION 3.4.1)
#设置头文件目录
include_directories(
../LibLive555/BasicUsageEnvironment/include/
../LibLive555/groupsock/include/
../LibLive555/liveMedia/include/
../LibLive555/UsageEnvironment/include/)
#用file获取当前目录的源文件
#file(GLOB rtspclientsrc RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cpp" ) #返回格式:xxx.cpp xxx.cpp
#list(REMOVE_ITEM rtspclientsrc "main.cpp")#排除main.cpp
#用aux_source_directory获取当前目录的源文件
aux_source_directory(. rtspclientsrc)#返还的文件格式:./xxx.cpp ./xxx.cpp
list(REMOVE_ITEM rtspclientsrc "./main.cpp")#排除./main.cpp
#设置静态库输出目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib/android/${ANDROID_ABI})
#设置动态库输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../lib/android/${ANDROID_ABI})
#设置库文件连接路径,要在add_library之前设置
link_directories("${PROJECT_SOURCE_DIR}/../lib/android/${ANDROID_ABI}")
#设置链接库,要在add_library之前设置
link_libraries(libLive555.a)
#生成静态库
add_library(RtspClient STATIC ${rtspclientsrc})
#链接前面静态库,不然静态库不编译
link_libraries(RtspClient)
#生成动态库,Tag名称不能与前面静态库重名
add_library(RtspClient-lib SHARED ${rtspclientsrc})
set_target_properties(RtspClient-lib PROPERTIES OUTPUT_NAME "RtspClient")#重命名动态库跟静态库一致
#设置目标链接的库
#target_link_libraries(
# RtspClient-lib
# RtspClient
#)
指定需要CMAKE的最小版本
cmake_minimum_required(VERSION 3.4.1)
设置头文件路径
#添加包含头文件目录
include_directories(${HELLO_SOURCE_DIR}/include)
获取源文件
#设置源文件列表
set(SRC_LIST hello.c)
#用file获取当前目录的源文件
file(GLOB rtspclientsrc RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cpp" ) #返回格式:xxx.cpp xxx.cpp
list(REMOVE_ITEM rtspclientsrc "main.cpp")#排除main.cpp
#用aux_source_directory获取当前目录的源文件
aux_source_directory(. rtspclientsrc)#返还的文件格式:./xxx.cpp ./xxx.cpp
list(REMOVE_ITEM rtspclientsrc "./main.cpp")#排除./main.cpp
#获取子目录源文件
aux_source_directory(./groupsock src)
设置链接库
#设置生成的静态库文件的路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib/android/${ANDROID_ABI})
#设置生成动态库文件的路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../lib/android/${ANDROID_ABI})
#设置库文件连接路径,要在add_library之前设置
link_directories("${PROJECT_SOURCE_DIR}/../lib/android/${ANDROID_ABI}")
#生成的库文件
add_library(hello STATIC ${SRC_LIST}) #静态库,主要AS中单独静态库不编译,要链接使用下才会编译
add_library(hello SHARED ${SRC_LIST}) #动态库
set_target_properties(hello PROPERTIES OUTPUT_NAME "hello-rename")#重命名动态库跟静态库一致
#设置链接库,要在add_library之前设置
link_libraries(libLive555.a)
#需要链接的库文件
target_link_libraries(hello $(GLIBC_LIB))
设置编译器
#设置编译器
set(CMAKE_C_COMPILER gcc)
#glibc 库目录
set(GLIBC_INCLUDE /usr/include/glib-2.0 /usr/lib/x86_64-linux-gnu/glib-2.0/include)
#glibc 库文件
set(GLIBC_LIB glib-2.0)
#添加编译器选项
add_definitions(
-Wno-format-security #去警告
-D__USE_POSIX #宏定义
-include ${PROJECT_SOURCE_DIR}/../Include/PlatformHeader.h #强制包含头文件
)
#判断编译平台
if(UNIX OR ANDROID)#WIN32 APPLE
#message(WARNING "UNIX or ANDROID ")
endif()
if (CMAKE_SYSTEM_NAME MATCHES "Linux") #Windows FreeBSD Android
message(WARNING "${CMAKE_SYSTEM_NAME} + ${CMAKE_SYSTEM}" )
endif()
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") # Debug模式下的编译指令
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") # Release模式下的编译指令
内部变量
CMAKE_C_COMPILER:指定C编译器
CMAKE_CXX_COMPILER:指定C++编译器
CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项
EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径
LIBRARY_OUTPUT_PATH:库文件路径
CMAKE_BUILD_TYPE: build 类型(Debug, Release, …),CMAKE_BUILD_TYPE=Debug
BUILD_SHARED_LIBS:Switch between shared and static libraries
define_source_files()
Project(CmakeTest)
#add_executable(project1 ${src}) #编译为可执行程序
#SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin) #设置可执行文件的输出目录
#add_library(project1 MODULE ${src}) #编译为程序资源包 *.bundle
#set_target_properties(project1 PROPERTIES BUNDLE TRUE)
#add_library(project1 SHARED ${src}) #编译为程序资源包 *.framework
#set_target_properties(project1 PROPERTIES FRAMEWORK TRUE)
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin)
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../bin)
#上面两条语句分别设置了Debug版本和Release版本可执行文件的输出目录,
#一旦设置上面的属性,在任何环境下生成的可执行文件都将直接放在你所设置的目录.
#四. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../lib)
# set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../lib)
#上面两条语句分别设置了Debug版本和Release版本库文件的输出目录,
#一旦设置上面的属性,在任何环境下生成的库文件都将直接放在你所设置的目录.