代码备忘录(CMakeLists.txt)

CMakeLists.txt

  1. 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()
  1. 使用set定义变量
set(PROJECT_INCLUDE
        PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/log
        PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/util)
        
  1. 添加静态依赖库
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)
  1. 变量附加
list(APPEND PROJECT_INCLUDE
        PRIVATE ${MD5CORE_STATIC_DIR}/include)
  1. 配置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}
)

  1. 设置一个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
  1. 获取一个路径并赋值给一个变量
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目录

  1. 添加子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)
  1. 设置Cmake language
project(liveEffect LANGUAGES C CXX)
  1. 添加编译选项
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>)
  1. message打印编译信息
 MESSAGE( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]"message to display" ...)
  1. 设置so库输出的名字,oboe–>myoboe

set_target_properties(_renderdoc PROPERTIES PREFIX "")//默认有lib前缀,此处删除前缀
set_target_properties(oboe PROPERTIES OUTPUT_NAME "myoboe")

上述是最近写项目用到的,下面是别人总结的,看起来也会频繁使用

  1. 判断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()
  1. 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 ()
  1. 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()
  1. CMAKE_COMPILER_IS_GNUCXX
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-cast-function-type -Wno-stringop-truncation")
endif()
  1. 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})
  1. set_source_files_properties
    set_source_files_properties(3rdparty/tinyexr/tinyexr.cpp
        PROPERTIES COMPILE_FLAGS "-Wno-extra -Wno-unused-function")
  1. 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>)
  1. 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 && :
  1. 编译cpp文件,但是不使用标准库时,可能会报错
    error: undefined reference to ‘__gxx_personality_v0’
    采取以下方式,可以编译成功
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值