CMake

本文介绍了CMake在解决[-Werror,-Wformat-security]编译警告的方法,提供了一个完整的CMake配置示例,包括指定CMake最小版本、设置头文件路径、获取源文件、链接库、编译器选项以及内部变量的使用,如CMAKE_C_COMPILER、CMAKE_CXX_COMPILER、CMAKE_C_FLAGS等。还提到了CMAKE_BUILD_TYPE用于设定构建类型和BUILD_SHARED_LIBS用于切换库的动态或静态编译。" 122839015,10653075,使用Trie树求解最大异或对,"['数据结构', '算法', 'C++']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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版本库文件的输出目录,
#一旦设置上面的属性,在任何环境下生成的库文件都将直接放在你所设置的目录.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值