学习网址:
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/