CMakeLists.txt
- CMAKE_BUILD_TYPE
string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower)
if(cmake_build_type_lower STREQUAL "release")
message(VERBOSE "begin build release")
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_C_VISIBILITY_PRESET hidden)
else()
message(VERBOSE "begin build debug")
add_definitions(-DDEBUG)
endif()
- 使用set定义变量
set(PROJECT_INCLUDE
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/log
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/util)
- 添加静态依赖库
set(MD5CORE_STATIC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/imported-libs/md5core)
add_library(md5core_static STATIC IMPORTED)
set_target_properties(md5core_static PROPERTIES
IMPORTED_LOCATION ${MD5CORE_STATIC_DIR}/${ANDROID_ABI}/libmd5core_static.a)
set(PROJECT_DEP_LIB md5core_static)
- 变量附加
list(APPEND PROJECT_INCLUDE
PRIVATE ${MD5CORE_STATIC_DIR}/include)
- 配置project
target_include_directories(sharedLib ${PROJECT_INCLUDE})
find_library(
log-lib
log )
list(APPEND PROJECT_DEP_LIB
${log-lib})
target_link_libraries(
sharedLib
${PROJECT_DEP_LIB}
)
- 设置一个bool值
option(ENABLE_DEBUG "Enable debug" ON)
set(ENABLE_DEBUG ON CACHE BOOL "" FORCE)// ON即为true
set(ENABLE_DEBUG OFF CACHE BOOL "" FORCE)//OFF为false
- 获取一个路径并赋值给一个变量
get_filename_component(PROJECT_ROOT_DIR
${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)
------project
-----------------app
-----------------module1
-----------------module2
比如app/src/main/cpp/CMakeLists.txt中使用了上述中的get_filename_component, 则PROJECT_ROOT_DIR的值最后为project目录
- 添加子make
该命令将加载project目录下面的CMakeLists.txt, 其匿名化为oboe-bin, 与路径也有关系(./app/.cxx/cmake/debug/arm64-v8a/oboe-bin/)
set (OBOE_DIR ${PROJECT_ROOT_DIR})
add_subdirectory(${OBOE_DIR} ./oboe-bin)
- 设置Cmake language
project(liveEffect LANGUAGES C CXX)
- 添加编译选项
target_compile_options(oboe
PRIVATE
-std=c++17
-Wall
-Wextra-semi
-Wshadow
-Wshadow-field
-Ofast
"$<$<CONFIG:DEBUG>:-Werror>")
11)添加宏定义
target_compile_definitions(oboe PUBLIC $<$<CONFIG:DEBUG>:OBOE_ENABLE_LOGGING=1>)
- message打印编译信息
MESSAGE( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]"message to display" ...)
- 设置so库输出的名字,oboe–>myoboe
set_target_properties(_renderdoc PROPERTIES PREFIX "")//默认有lib前缀,此处删除前缀
set_target_properties(oboe PROPERTIES OUTPUT_NAME "myoboe")
上述是最近写项目用到的,下面是别人总结的,看起来也会频繁使用
- 判断java环境变量
set(SAVE_JAVA_HOME $ENV{JAVA_HOME})
set(ENV{JAVA_HOME} "")
find_package(Java REQUIRED)
set(ENV{JAVA_HOME} ${SAVE_JAVA_HOME})
if(${Java_VERSION} VERSION_LESS 1.8)
message(FATAL_ERROR "Building Android requires the 'java' program in your PATH to be at least Java 8 (1.8)")
endif()
message(STATUS "Using Java of version ${Java_VERSION}")
if(NOT DEFINED ENV{JAVA_HOME})
message(FATAL_ERROR "JAVA_HOME environment variable must be defined for Android build")
endif()
message(STATUS "Using JAVA_HOME = $ENV{JAVA_HOME}")
execute_process(COMMAND $ENV{JAVA_HOME}/bin/java -version
RESULT_VARIABLE _result
OUTPUT_VARIABLE _output
ERROR_VARIABLE _output
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if(NOT _result AND _output MATCHES "version \"([0-9]+).([0-9]+)")
message(STATUS "Java in JAVA_HOME is ${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
else()
message(STATUS "Java in JAVA_HOME is unknown version ${_output} ${_result}")
endif()
- CMAKE_VERSION
if (CMAKE_VERSION VERSION_LESS "3.1")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++14")
else ()
set (CMAKE_CXX_STANDARD 14)
endif ()
- CMAKE_CXX_COMPILER_ID
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option -Wno-unused-private-field")
endif()
- CMAKE_COMPILER_IS_GNUCXX
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-cast-function-type -Wno-stringop-truncation")
endif()
- add_library->OBJECT
add_library(objs OBJECT ${sources})
target_compile_definitions(objs ${OBJS_DEFINITIONS})
target_include_directories(objs ${OBJS_INCLUDES})
list(APPEND sharedLib_objects
$<TARGET_OBJECTS:objs>)
add_library(sharedLib SHARED ${sharedLib_objects})
- set_source_files_properties
set_source_files_properties(3rdparty/tinyexr/tinyexr.cpp
PROPERTIES COMPILE_FLAGS "-Wno-extra -Wno-unused-function")
- list指令
list(LENGTH <list><output variable>)
list(GET <list> <elementindex> [<element index> ...]<output variable>)
list(APPEND <list><element> [<element> ...])
list(FIND <list> <value><output variable>)
list(INSERT <list><element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value>[<value> ...])
list(REMOVE_AT <list><index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
- file指令比较多
file(APPEND filename "message to write"... )
APPEND 如同WRITE,区别在于它将信息内容追加到文件末尾
file(READ filename variable [LIMIT numBytes] [OFFSEToffset] [HEX])
file(<MD5|SHA1|SHA224|SHA256|SHA384|SHA512> filenamevariable)
file(STRINGS myfile.txt myfile), 将输入文件的每行内容存储在变量"myfile"中
file(RENAME <oldname> <newname>)
file(REMOVE [file1 ...])
file(MAKE_DIRECTORY [directory1 directory2 ...])
file(<COPY|INSTALL> files... DESTINATION<dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONSpermissions...]
[NO_SOURCE_PERMISSIONS][USE_SOURCE_PERMISSIONS]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX<regex>]
[EXCLUDE] [PERMISSIONSpermissions...]] [...])
COPY表示复制文件,目录以及符号链接到一个目标文件夹中。输入路径将视为相对于当前源码目录的路径。目标路径则是相对于当前的构建目录。复制保留输入文件的一些权限属性,
除非显式指定了NO_SOURCE_PERMISSIONS(默认是USE_SOURCE_PERMISSIONS),关于文件权限,PATTERN,REGX和EXCLUDE等相关选项可参考install(DIRECTORY)命令的文档。
INSTALL 与COPY略微有点不同:它打印状态信息,并且默认情况下指定了 NO_SOURCE_PERMISSIONS。
22)c++_static.a链接后,会将很多std的符号导出,可以这样抹去:
set_target_properties(
${PROJECT_NAME}
PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
)
##ALL去掉后,可以通过报错看到编译选项
set_target_properties(
PROJECT_NAME
PROPERTIES LINK_FLAGS "-Wl,--exclude-libs,ALL")
出错如下:(lib/.cxx/cmake/release/x86_64/cmake_server_log.txt)
: && /Users/admin/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi19 --gcc-toolchain=/Users/admin/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/admin/Library/Android/sdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fvisibility=hidden -fvisibility-inlines-hidden -Oz -DNDEBUG -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,--exclude-libs -shared -Wl,-soname,libnativemonitor.so -o /Users/admin/AndroidStudioProjects/Demo/CxxLib/build/intermediates/cmake/release/obj/armeabi-v7a/libtest.so CMakeFiles/nativemonitor.dir/LibEntry.cpp.o other-bin/libother.a -llog -latomic -lm && :
- 编译cpp文件,但是不使用标准库时,可能会报错
error: undefined reference to ‘__gxx_personality_v0’
采取以下方式,可以编译成功
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")