cmake的基本用法
一、message()函数
message :为用户显示一条消息
message( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]
"message to display" ...)
# (无) = 重要消息;
# STATUS = 非重要消息;
# WARNING = CMake 警告, 会继续执行;
# AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
# SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
# FATAL_ERROR = CMake 错误, 终止所有处理过程;
1.输出错误 FATAL_ERROR
message(FATAL_ERROR "
FATAL: In-source builds are not allowed.
You should create a separate directory for build files.
")
2.输出警告 WARNING
message(WARNING "OpenCV requires Android SDK tools revision 14 or newer.")
3.输出正常 STATUS
message(STATUS "Can't detect runtime and/or arch")
4.输出变量的值
在cmake定义了一个变量“USER_KEY”,并打印此变量值。status表示这是一般的打印信息,我们还可以设置为“ERROR”,表示这是一种错误打印信息。
SET(USER_KEY, "Hello World")
MESSAGE( STATUS "this var key = ${USER_KEY}.")
二、“ PROJECT_BINARY_DIR ” 和 “ PROJECT_SOURCE_DIR ”
目录结构:
" PROJECT_BINARY_DIR " 是CMake生成一系列文件的目录,包括MakeFile等文件,如果你是让他们生成在build目录中就是 .../helloProject/build
" PROJECT_SOURCE_DIR "是顶级的CMakeLists.txt所在的目录,也就是 .../helloProject 目录
三、CMake 同一目录,多个源文件
目录结构:
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)
# 设置工程名
project (hello_cmake)
# 添加include头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(${PROJECT_SOURCE_DIR}/src DIR_SRCS)
# 指定生成目标
add_executable(hello_cmake ${DIR_SRCS})
四、CMake 多个源文件,多个目录
目录结构:
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)
# 设置工程名
project (hello_cmake)
# 填加文件搜索目录(包含头文件)
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_MAIN_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/hello DIR_HELLO_SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/world DIR_WORLD_SRCS)
# 指定生成目标
add_executable(hello_cmake ${DIR_MAIN_SRCS} ${DIR_HELLO_SRCS} ${DIR_WORLD_SRCS})
目录结构:
一共有3个CMakeLists.txt
一个顶级CMakeLists.txt,放在当前工程的根目录下:
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.5)
# 设置工程名
project (hello_cmake)
aux_source_directory(. DIR_SRCS)
# 添加头文件路径
include_directories("${PROJECT_SOURCE_DIR}/hello")
include_directories("${PROJECT_SOURCE_DIR}/world")
# 添加 hello 子目录
add_subdirectory(hello)
# 添加 world 子目录
add_subdirectory(world)
# 指定生成目标
add_executable(hello_cmake main.cpp)
# 添加链接库
target_link_libraries(hello_cmake hello world)
hello文件夹中的CMakeLists.txt
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (hello ${DIR_LIB_SRCS})
world文件夹中的CMakeLists.txt
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (world ${DIR_LIB_SRCS})
五、CMake 在Linux上编译生成动态库和静态库
目录结构:
# 设置CMake最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
# 设置目标链接库文件的存放位置
SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")
# 添加源文件目录
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src DIR_SRCS)
# 添加头文件目录
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include")
# 生成动态库
ADD_LIBRARY(hello SHARED ${DIR_SRCS})
# 生成静态库
ADD_LIBRARY(hello_static STATIC ${DIR_SRCS})
六、CMake 在Linux上使用动态库和静态库
1、使用动态库
目录结构:
cmake_minimum_required (VERSION 2.6)
project(hello_cmake)
# 头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
# 生成可执行文件
add_executable(hello_cmake main.cpp)
# 链接库到可执行文件
target_link_libraries(hello_cmake ${PROJECT_SOURCE_DIR}/dynamic/libhello.so)
或者写成
cmake_minimum_required (VERSION 2.6)
project(hello_cmake)
# 头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
# 添加动态库目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/dynamic)
# 生成可执行文件
add_executable(hello_cmake main.cpp)
# 链接库到可执行文件
target_link_libraries(hello_cmake libhello.so)
# 链接库到可执行文件,以下三种写法是相同的:
# target_link_libraries(myProject libhello.so) #这些库名写法都可以。
# target_link_libraries(myProject hello)
# target_link_libraries(myProject -lhello)
2、使用静态库
cmake_minimum_required (VERSION 2.6)
project(hello_cmake)
# 头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
# 添加静态库目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/static)
# 生成可执行文件
add_executable(hello_cmake main.cpp)
# 链接库到可执行文件
target_link_libraries(hello_cmake libhello_static.a)
# 链接库到可执行文件,以下三种写法都是可以的
# target_link_libraries(hello_cmake libhello_static.a)
# target_link_libraries(hello_cmake hello_static.a)
# target_link_libraries(hello_cmake hello_static)
标签:cmake,SRCS,用法,PROJECT,SOURCE,linux,hello,DIR
From: https://www.cnblogs.com/ran7/p/17842162.html