前面是名字,后面是指这个库是必须的
何给动态库添加三方库依赖
用LINK_DIRECTORIES 来指定三方库路径,然后通过库名称去链接。需要注意一个坑就是LINK_DIRECTORIES 要放到 ADD_LIBRARY 前面才行
file(GLOB_RECURSE header1_files "src/main/cpp/3rd/*.h") file(GLOB_RECURSE source1_files "src/main/cpp/3rd/*.cpp") LINK_DIRECTORIES("libs/${ANDROID_ABI}") # 添加三方库的绝对/相对路径,用于搜索三方库。但是千万要注意一点:要放到ADD_LIBRARY之前,否则不生效! ADD_LIBRARY ( my_lib # 设置生成动态库的名称 SHARED # 设置库类型,STATIC 或 SHARED # 需要编译的c/c++ 文件 ${source1_files} src/main/cpp/jni_main.cpp ) target_link_libraries( my_lib # 链接目标 # Links the target library to the log library included in the NDK ${log-lib} plug_ins_project # 这个就是对应libplug_ins_project.so库文件 )
编写CMakeLists.txt最常用的功能就是调用其他的.h头文件和.so/.a库文件,将.cpp/.c/.cc文件编译成可执行文件或者新的库文件。
通常一个CMakeLists.txt需按照下面的流程:
project(xxx) #必须 add_subdirectory(子文件夹名称) #父目录必须,子目录不必 add_library(库文件名称 STATIC 文件) #通常子目录(二选一) add_executable(可执行文件名称 文件) #通常父目录(二选一) include_directories(路径) #必须 link_directories(路径) #必须 target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称) #必须
CMakeLists.txt的基本结构
编写CMakeLists.txt最常用的功能就是调用其他的.h头文件和.so/.a库文件,将.cpp/.c/.cc文件编译成可执行文件或者新的库文件。
命令的官方网站:CMake Reference Documentation
最常用的命令如下(仅供后期查询,初期不需要细看):
# 本CMakeLists.txt的project名称 # 会自动创建两个变量,PROJECT_SOURCE_DIR和PROJECT_NAME # ${PROJECT_SOURCE_DIR}:本CMakeLists.txt所在的文件夹路径 # ${PROJECT_NAME}:本CMakeLists.txt的project名称 project(xxx) # 获取路径下所有的.cpp/.c/.cc文件,并赋值给变量中 aux_source_directory(路径 变量) # 给文件名/路径名或其他字符串起别名,用${变量}获取变量内容 set(变量 文件名/路径/...) # 添加编译选项 add_definitions(编译选项) # 打印消息 message(消息) # 编译子文件夹的CMakeLists.txt add_subdirectory(子文件夹名称) # 将.cpp/.c/.cc文件生成.a静态库 # 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可 add_library(库文件名称 STATIC 文件) # 将.cpp/.c/.cc文件生成可执行文件 add_executable(可执行文件名称 文件) # 规定.h头文件路径 include_directories(路径) # 规定.so/.a库文件路径 link_directories(路径) # 对add_library或add_executable生成的文件进行链接操作 # 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可 target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)
各行代表的含义
第1行:cmake需要的最低版本
第2行:创建了一个名为 HelloWorld 工程,对应生成一个 HelloWorld.sln 。project函数表示创建一个工程
第3行:添加一个名为 HelloWorld 的可执行程序项目,它的源代码为 HelloWorld.cxx