Cmake使用摘要
2020-02-14 本文已影响0人
sam寨
Cmake使用常识
-
Cmake设置变量
与我们平时的编程语言不同,并不是如
int a = 1
这样设置的。Cmake中全部的操作都是通过调用方法来设置的。
如设置一个变量
DIR = “/dir/abc”
,应该是使用SET方法set(DIR /dir/abc)
-
Cmake命令不区分大小写,变量区分大小写
-
Cmake中所有的变量都是字符串,所以加不加引号都是一样的
set(DIR /dir/abc)
与set(DIR “/dir/abc”)
是一样的。只有当变量的值存在空格的时候引号才是必要的。例如
set(DIR "/dir/a b")
,这里a b是一个文件,这个文件名中间有一个空格,如果这里不加引号,cmake将识别错误 -
Cmake的注释
使用#进行注释,只有单行注释没有多行注释
-
Cmake的变量引用
与shell脚本差不多,使用${var}进行变量引用。
-
Cmake必须由
cmake_minimum_required(VERSION 3.4.1)
这句开头版本号根据实际需要来即可
-
Cmake编译流程
按编译流程来说,Cmake完成的任务就是
- 设置头文件目录
- 设置库文件目录
- 找到库文件
- 编译库文件
- 链接库文件
- ...
所以不是很难,不需要担心,理清楚这几个,再注意一些细节即可(高级用法除外)
Cmake使用要点
-
Cmake常用命令
#设置cmake版本,必须放在第一行,版本按自己需要设置即可。 #这里的版本号3.4.1,实际是字符串 cmake_minimum_required(VERSION 3.4.1) #设置变量,将abcdefg设置给VAR set(VAR abcdefg) #打印日志 message(STATUS "this print a message") #添加一个library,将源码编译为指定的库 add_library( native-lib SHARED native-lib.cpp) #通过添加三方库,来添加一个library。这里,add_library要与set_target_properties一起使用 add_library(third_party_lib SHARED IMPORTED) set_target_properties(third_party_lib PROPERTIES IMPORTED_LOCATION xxx/libthird_party_lib.so) #添加文件路径 include_directories(/dir/includes) #添加库文件路径 link_directories() #将库文件链接到一起 target_link_libraries( my_lib lib1 lib2 ... )
-
Cmake常用变量
#CmakeLists.txt所在的路径 message(STATUS ${CMAKE_SOURCE_DIR}) #ANDROID ABI message(STATUS ${ANDROID_ABI})
FFMpeg配置共享
cmake_minimum_required(VERSION 3.4.1)
#使用file列出所有的.cpp文件作为source files,
#需要注意使用这个方法后,无论源文件是否有添加或删除,CMakeLists.txt文件不会变化,则cmake无法检测,
#所以如果源文件有变化需要手动来改一下CMakeLists.txt,使cmake探测变化.
file(GLOB source_files *.cpp)
add_library(native-lib SHARED ${source_files})
#添加头文件路径
set(include_dir ${CMAKE_CURRENT_SOURCE_DIR}/ffmpeg)
message("** include dir is ${include_dir}")
include_directories(${include_dir})
#设置so文件路径
set(so_dir ${PROJECT_SOURCE_DIR}/../jniLibs/armeabi-v7a)
message("** project source dir is ${so_dir}")
#导入so库, 并将lib名添加到lib_name_list里面
file(GLOB so_files ${so_dir}/*.so)
foreach (so_file_path ${so_files})
string(REGEX REPLACE ".+/(.+)\\..*" "\\1" lib_name ${so_file_path})
message("** lib name : ${lib_name}, path : ${so_file_path}")
list(APPEND lib_name_list ${lib_name})
add_library(${lib_name} SHARED IMPORTED)
set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION ${so_file_path})
endforeach ()
#链接
#################注意##################
# find_library (<VAR> name1 [path1 path2 ...])
# add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][source1] [source2 ...])
# find_library后面跟的是变量,所以下面要使用 ${log-lib}
# add_library后面跟的是name,不是一个变量,所以一定不能写成${native-lib},否则会报错
#######################################
find_library(log-lib log)
target_link_libraries(
native-lib
${lib_name_list}
${log-lib}
)