CMake入门教程

学习网址:

CMake入门教程 CMake入门教程_迪迦 • 奥特曼-CSDN博客_cmake教程

CMake 简便手册
http://shaoguangleo.github.io/2015/12/07/cmake-tutorial/

CMakeLists.txt常用命令速查
https://blog.csdn.net/z_johnking/article/details/120590395?spm=1001.2014.3001.5506 


Release和Debug的编译方式 

//Release模式的编译方法
mkdir Release  
cd Release  
cmake -DCMAKE_BUILD_TYPE=Release ..  
make  

//Debug模式的编译方法
mkdir Debug  
cd Debug  
cmake -DCMAKE_BUILD_TYPE=Debug ..  
make  


---------------------------------------------------------
//在CMakeLists.txt文件里添加下面的内容
#set(BuildType "Release")
#set(BuildType "Debug")

if(${BuildType} MATCHES "Release")
    message(STATUS "Release版本")
	SET(CMAKE_BUILD_TYPE "Release")
	SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") ###
else()
	message(STATUS "Debug版本")
	SET(CMAKE_BUILD_TYPE "Debug")
	SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") ###
endif()

 注意:如果不使用CMAKE_BUILD_TYPE参数,则默认是Debug


aux_source_directory 

//添加当前目录cpp和c文件
aux_source_directory(. TEST_SRC_LIST) 

--------------------------------------------------------------

#遍历子目录,包含所有的cpp和c文件
#设置子目录
set(SUB_DIR_LIST "Network" "Poller" "Thread" "Util")

foreach(SUB_DIR ${SUB_DIR_LIST})
    #遍历源文件
    aux_source_directory(src/${SUB_DIR} SRC_LIST)
endforeach()


LINK_DIRECTORIES

添加需要链接的库文件目录LINK_DIRECTORIES
语法:
link_directories(directory1 directory2 ...)
 

LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH})


file(GLOB

包含了各个子目录的cpp、c和h文件
file(GLOB MediaKit_src_list ${MediaKit_Root}/*/*.cpp ${MediaKit_Root}/*/*.h ${MediaKit_Root}/*/*.c)

使用该文件操作命令时,相对路径的书写最前面不要加任何修饰,
习惯错误写法FILE(GLOB EXTENDED /doc/)、FILE(GLOB EXTENDED ./doc/)


单行注释:使用“#”
多行注释:使用“#[[ ]]”


一个基于pkg-config的cmakelist.txt例子: 

#1.开头的设置
project(pjsip_shout)
cmake_minimum_required(VERSION 3.1.3)

set(BuildType "Release")
#set(BuildType "Debug")

if(${BuildType} MATCHES "Release")
    message(STATUS "Release版本")
	SET(CMAKE_BUILD_TYPE "Release")
	SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") ###
else()
	message(STATUS "Debug版本")
	SET(CMAKE_BUILD_TYPE "Debug")
	SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") ###
endif()

##############################################################################
#ARM
# SET(CMAKE_SYSTEM_NAME Linux)
# SET(CMAKE_SYSTEM_PROCESSOR arm)
# SET(TOOLCHAIN_DIR "/opt/hisi-linux/x86-arm/aarch64-himix100-linux")
# SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
# SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-himix100-linux-gcc)
# SET(CMAKE_CXX_COMPILER  ${TOOLCHAIN_DIR}/bin/aarch64-himix100-linux-g++)
# #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-aggressive-loop-optimizations -ffunction-sections")
# #set(CMAKE_CXX_STANDARD 11)
# #set(CMAKE_CXX_STANDARD_REQUIRED ON)
# add_definitions(-D_GLIBCXX_USE_C99=1)


##############################################################################
#加载自定义模块
#set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

##############################################################################
#2.make install安装路径
#设置编译生成的库文件路径, PROJECT_BINARY_DIR是build文件夹路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
#设置编译生成的可执行程序路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

#安装目录include,.h文件install此目录
if(WIN32)
    set(INSTALL_PATH_LIB $ENV{HOME}/${CMAKE_PROJECT_NAME}/lib)
    set(INSTALL_PATH_INCLUDE $ENV{HOME}/${CMAKE_PROJECT_NAME}/include)
else()
    set(INSTALL_PATH_LIB lib)
    set(INSTALL_PATH_INCLUDE include)
endif()

##############################################################################
#3.包含cpp文件,遍历子目录中的cpp文件
#设置子目录
#set(SUB_DIR_LIST "Network" "Poller" "Thread" "Util")

if(WIN32)
    list(APPEND SUB_DIR_LIST "win32")
    #防止Windows.h包含Winsock.h
    add_definitions(-DWIN32_LEAN_AND_MEAN)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()

#foreach(SUB_DIR ${SUB_DIR_LIST})
#    #遍历源文件
#    aux_source_directory(src/${SUB_DIR} SRC_LIST)
#    #安装头文件至系统目录
#    install(DIRECTORY src/${SUB_DIR} DESTINATION ${INSTALL_PATH_INCLUDE} FILES_MATCHING PATTERN "*.h")
#endforeach()

#非苹果平台移除.mm类型的文件
#if(NOT APPLE)
#    list(REMOVE_ITEM SRC_LIST "src/Network/Socket_ios.mm")
#endif()

##############################################################################
#5.包含头文件
#引用头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)


##############################################################################
#4.包含库文件
if(WIN32)
    set(LINK_LIB_LIST WS2_32 Iphlpapi shlwapi)
else()
    set(LINK_LIB_LIST)
endif()

##############################################################################
#set(ENABLE_OPENSSL ON CACHE BOOL "enable openssl")
#set(ENABLE_MYSQL ON CACHE BOOL "enable mysql")

#set(ENABLE_OPENSSL OFF CACHE BOOL "enable openssl")
#set(ENABLE_MYSQL OFF CACHE BOOL "enable mysql")


#查找openssl是否安装
#find_package(OpenSSL QUIET)
#if(OPENSSL_FOUND AND ENABLE_OPENSSL)
#    message(STATUS "找到openssl库:\"${OPENSSL_INCLUDE_DIR}\",ENABLE_OPENSSL宏已打开")
#    include_directories(${OPENSSL_INCLUDE_DIR})
#    add_definitions(-DENABLE_OPENSSL)
#    list(APPEND  LINK_LIB_LIST ${OPENSSL_LIBRARIES})
#endif()

#查找mysql是否安装
#find_package(MYSQL QUIET)
#if(MYSQL_FOUND AND ENABLE_MYSQL)
#    message(STATUS "找到mysqlclient库:\"${MYSQL_INCLUDE_DIR}\",ENABLE_MYSQL宏已打开")
#    include_directories(${MYSQL_INCLUDE_DIR})
#    include_directories(${MYSQL_INCLUDE_DIR}/mysql)
#    add_definitions(-DENABLE_MYSQL)
#    list(APPEND  LINK_LIB_LIST ${MYSQL_LIBRARIES})
#endif()

#查找pjsip是否安装,变量在CMakeCache.txt里都能找到
#set(ENV{PKG_CONFIG_PATH} /home/tf/work/project/01_voip/pjsip_shout/3rdpart/pjsip/nano/lib/pkgconfig)
set(ENV{PKG_CONFIG_PATH} /home/nano/wanxiu_test/pjsip_shout/3rdpart/pjsip/nano/lib/pkgconfig)

find_package(PkgConfig)
pkg_search_module(PJSIP REQUIRED libpjproject)

if (PJSIP_FOUND)
    # message(STATUS "找到PJSIP头文件:\"${PJSIP_INCLUDE_DIRS}\"")
    # message(STATUS "找到PJSIP库路径:\"${PJSIP_LIBRARY_DIRS}\"")
    # message(STATUS "找到PJSIP库文件:\"${PJSIP_STATIC_LIBRARIES}\"")
    # message(STATUS "找到PJSIP ldflags:\"${PJSIP_LDFLAGS}\"")
    # message(STATUS "找到PJSIP Cflags:\"${PJSIP_CFLAGS_OTHER}\"")

    include_directories(${PJSIP_INCLUDE_DIRS})
    list(APPEND LINK_LIB_LIST ${PJSIP_STATIC_LIBRARIES})
    link_directories(${PJSIP_LIBRARY_DIRS})

   #设置依赖pkg的CGLAGS
    FOREACH(flag ${PJSIP_CFLAGS_OTHER})
    SET(EXTRA_CFLGAS "${EXTRA_CFLGAS} ${flag}")
    ENDFOREACH(flag)
endif (PJSIP_FOUND)


# message(STATUS "=== PJSIP_LIBRARIES: ${PJSIP_LIBRARIES}")
# message(STATUS "=== PJSIP_INCLUDE_DIRS: ${PJSIP_INCLUDE_DIRS}")


#打印库文件
message(STATUS "将链接依赖库:${LINK_LIB_LIST}")

##############################################################################
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLGAS}") 
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLGAS}") 




##############################################################################
#6.设置编译选项
#使能c++11
#set(CMAKE_CXX_STANDARD 11)

if(NOT WIN32)
    add_compile_options(-Wno-deprecated-declarations)
    add_compile_options(-Wno-predefined-identifier-outside-function)
endif()


##############################################################################
#7.编译生成exe或者库文件
#编译动态库
#if(NOT IOS AND NOT ANDROID)
#    add_library(${CMAKE_PROJECT_NAME}_shared SHARED ${SRC_LIST})
#    target_link_libraries(${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST})
#    set_target_properties(${CMAKE_PROJECT_NAME}_shared PROPERTIES OUTPUT_NAME "${CMAKE_PROJECT_NAME}")
#    install(TARGETS ${CMAKE_PROJECT_NAME}_shared  ARCHIVE DESTINATION ${INSTALL_PATH_LIB} LIBRARY DESTINATION ${INSTALL_PATH_LIB})
#endif()

#编译静态库
#add_library(${CMAKE_PROJECT_NAME}_static STATIC ${SRC_LIST})
#set_target_properties(${CMAKE_PROJECT_NAME}_static PROPERTIES OUTPUT_NAME "${CMAKE_PROJECT_NAME}")
#安装静态库至系统目录
#install(TARGETS ${CMAKE_PROJECT_NAME}_static ARCHIVE DESTINATION ${INSTALL_PATH_LIB})



#However, the file(GLOB...) allows for wildcard additions:
file(GLOB SOURCES "src/*.c")

add_executable(app_shout ${SOURCES})
target_link_libraries(app_shout ${LINK_LIB_LIST} libm.so.6 )

指定编译/运行时动态库链接路径

linux cmake分别指定编译/运行时动态库链接路径(引用学习这篇文章)
https://blog.csdn.net/JCYAO_/article/details/102519998 

3 指定链接路径
把我们需要用的库,全部拷贝出来,统一放在一个lib目录下 

###################################################################################################################
set(OPENCV_DYNAMIC_LIBS  "${CMAKE_CURRENT_SOURCE_DIR}/../lib")       # 动态 opencv native 库路径
add_library(libopencv_core SHARED IMPORTED )
set_target_properties(libopencv_core PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_core.so")
add_library(libopencv_highgui SHARED IMPORTED )
set_target_properties(libopencv_highgui PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_highgui.so")
add_library(libopencv_imgproc SHARED IMPORTED )
set_target_properties(libopencv_imgproc PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_imgproc.so")
add_library(libopencv_video SHARED IMPORTED )
set_target_properties(libopencv_video PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_video.so")

set(mOpenCV_LIBS  libopencv_core libopencv_highgui  libopencv_imgproc libopencv_video)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp ")
target_link_libraries(main ${mOpenCV_LIBS} )

类似上面,添加好所有需要的库,链接的时候就能找得到自定义路径lib下面的库了

4 指定运行时加载的库
只需要再cmake路径下加上如下:

SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) 
SET(CMAKE_INSTALL_RPATH "\${ORIGIN}/lib") #指定运行时动态库的加载路径,ORIGIN指运行文件所在目录

动态库编译 :指定包含的so文件,可执行程序就可以不用再包含so文件了

set(CMAKE_SKIP_BUILD_RPATH FALSE)

CMAKE和RPATH
https://blog.csdn.net/hjwang1/article/details/103315809/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值