日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CMakeList笔记

發(fā)布時(shí)間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CMakeList笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 定義

    CMake是一種跨平臺(tái)編譯工具,CMake主要是編寫CMakeLists.txt文件,然后通過(guò)cmake命令將CMakeLists.txt文件轉(zhuǎn)化為make所需要的Makefile文件,最后用make命令編譯源碼生成可執(zhí)行程序或者庫(kù)文件。

  • 語(yǔ)法規(guī)則

    指令是大小寫無(wú)關(guān)的,參數(shù)和變量是大小寫相關(guān)的

    • CMakeLists.txt常見(jiàn)指令
      1、cmake_minimum_required(VERSION 2.6)命令
      #指定CMake編譯最低要求版本
      例:CMAKE_MINIMUM_REQUIRED(VERSION 3.14)

      2、PROJECT(<projectname>)命令
      #給項(xiàng)目命名
      PROJECT(TEST)

      3、ADD_SUBDIRECTORY命令
      #該命令告訴CMake去子目錄中查看可用的CMakeLists.txt文件

      4、ADD_EXECUTABLE命令
      #將hello.cpp生成可執(zhí)行文件hello
      ADD_EXECUTABLE(hello ${SOURCE})

      5、ADD_LIBRARY命令
      #變量SRC_LIST_CPP 與SRC_LIST_C 指定生成test動(dòng)態(tài)庫(kù) 默認(rèn)生成靜態(tài)庫(kù) SHARED指定生成庫(kù)類型為動(dòng)態(tài)庫(kù)
      ADD_LIBRARY(test SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})
      ADD_LIBRARY(test STATIC util.cpp) # 生成靜態(tài)庫(kù)

      6、FILE命令
      #收集c/c++文件并賦值給變量SRC_LIST_CPP ${PROJECT_SOURCE_DIR}代表區(qū)當(dāng)前項(xiàng)目錄
      FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)

      7、INCLUDE_DIRECTORIES命令
      #指定頭文件目錄
      INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

      8、LINK_DIRECTORIES命令
      #指定鏈接庫(kù)文件目錄
      LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)

      9、TARGET_LINK_LIBRARIES命令
      #指定hello 鏈接庫(kù)test
      TARGET_LINK_LIBRARIES(hello test)

      10、AUX_SOURCE_DIRECTORY命令
      #AUX_SOURCE_DIRECTORY(dir VAR) 發(fā)現(xiàn)一個(gè)目錄下所有的源代碼文件并將列表存儲(chǔ)在一個(gè)變量中
      AUX_SOURCE_DIRECTORY(. SRC_LIST) # 搜索當(dāng)前目錄下的所有.cpp文件,放到SRC_LIST變量中

      8、SET命令
      #用來(lái)顯式的定義變量
      例子:
      #用變量代替值,例子中定義SRC_LST代替后面的字符串
      SET (SRC_LST main.c test.c)
      #指定生成庫(kù)文件的目錄
      SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

      • 常用變量
      變量名含義
      JECT_NAMEproject命令中寫的項(xiàng)目名
      KE_VERSION當(dāng)前使用CMake的版本
      KE_SOURCE_DIR工程頂層目錄,即入口CMakeLists文件所在路徑
      JECT_SOURCE_DIR同CMAKE_SOURCE_DIR
      KE_BINARY_DIR工程編譯發(fā)生的目錄,即執(zhí)行cmake命令進(jìn)行項(xiàng)目配置的目錄,一般為build
      JECT_BINARY_DIR同CMAKE_BINARY_DIR
      KE_CURRENT_SOURCE_DIR當(dāng)前處理的CMakeLists.txt所在的路徑
      KE_CURRRENT_BINARY_DIR當(dāng)前處理的CMakeLists.txt中生成目標(biāo)文件所在編譯目錄
      KE_CURRENT_LIST_FILE輸出調(diào)用這個(gè)變量的CMakeLists.txt文件的完整路徑
      KE_CURRENT_LIST_DIR當(dāng)前處理的CMakeLists.txt文件所在目錄的路徑
      KE_INSTALL_PREFIX指定make install命令執(zhí)行時(shí)包安裝路徑
      KE_MODULE_PATHfind_package命令搜索包路徑之一,默認(rèn)為空
      KE_BUILD_TYPE編譯選項(xiàng),Release或者Debug,如set(CMAKE_BUILD_TYPE “Release”)
      KE_CXX_FLAGS編譯標(biāo)志,設(shè)置C++11編譯,set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11”)
  • 例子

#指定CMake編譯最低要求版本3.6 cmake_minimum_required(VERSION 3.6)#CMAKE_BUILD_TYPE 代替后面的字符串RelWithDebInfo CACHE STRING "build type" set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "build type")#給項(xiàng)目命名tutorial project(tutorialLANGUAGES C CXX )#CMAKE_RUNTIME_OUTPUT_DIRECTORY 代替后面的字符串${PROJECT_SOURCE_DIR} set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})if(ANDROID)#指定鏈接庫(kù)文件目錄${OPENSSL_LINK_DIR}link_directories(${OPENSSL_LINK_DIR}) else()find_library(LIBRT rt)find_package(OpenSSL REQUIRED) endif() find_package(workflow REQUIRED CONFIG HINTS ..) #指定頭文件目錄${OPENSSL_INCLUDE_DIR} ${WORKFLOW_INCLUDE_DIR} include_directories(${OPENSSL_INCLUDE_DIR} ${WORKFLOW_INCLUDE_DIR}) #指定鏈接庫(kù)文件目錄${WORKFLOW_LIB_DIR} link_directories(${WORKFLOW_LIB_DIR})if (KAFKA STREQUAL "y")find_path(SNAPPY_INCLUDE_PATH NAMES snappy.h)#指定頭文件目錄${SNAPPY_INCLUDE_PATH}include_directories(${SNAPPY_INCLUDE_PATH}) endif ()if (WIN32)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP /wd4200")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /wd4200 /std:c++14") else ()#CMAKE_C_FLAGS代替后面的字符串"${CMAKE_C_FLAGS} -Wall -fPIC -pipe -std=gnu90"set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fPIC -pipe -std=gnu90")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -pipe -std=c++11 -fno-exceptions") endif ()#TUTORIAL_LIST代替后面的字符串 set(TUTORIAL_LISTtutorial-00-helloworldtutorial-01-wgettutorial-04-http_echo_servertutorial-05-http_proxytutorial-06-parallel_wgettutorial-07-sort_tasktutorial-08-matrix_multiplytutorial-09-http_file_servertutorial-11-graph_tasktutorial-15-name_servicetutorial-20-reducer )if (APPLE)set(WORKFLOW_LIB workflow pthread OpenSSL::SSL OpenSSL::Crypto) elseif (ANDROID)set(WORKFLOW_LIB workflow ssl crypto c) else ()set(WORKFLOW_LIB workflow pthread OpenSSL::SSL OpenSSL::Crypto ${LIBRT}) endif ()foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)#將${src}.cc生成可執(zhí)行文件${bin_name} add_executable(${bin_name} ${src}.cc)#指定${bin_name}鏈接庫(kù)${WORKFLOW_LIB}target_link_libraries(${bin_name} ${WORKFLOW_LIB}) endforeach()if (NOT REDIS STREQUAL "n") set(TUTORIAL_LISTtutorial-02-redis_clitutorial-03-wget_to_redis ) foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)add_executable(${bin_name} ${src}.cc)target_link_libraries(${bin_name} ${WORKFLOW_LIB}) endforeach() endif()if (NOT MYSQL STREQUAL "n") set(TUTORIAL_LISTtutorial-12-mysql_cli ) foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)add_executable(${bin_name} ${src}.cc)target_link_libraries(${bin_name} ${WORKFLOW_LIB}) endforeach() endif()if (KAFKA STREQUAL "y")add_executable("kafka_cli" "tutorial-13-kafka_cli.cc")target_link_libraries("kafka_cli" wfkafka ${WORKFLOW_LIB} z snappy lz4 zstd) endif ()set(DIR10 tutorial-10-user_defined_protocol) add_executable(server ${DIR10}/server.cc ${DIR10}/message.cc) add_executable(client ${DIR10}/client.cc ${DIR10}/message.cc) target_link_libraries(server ${WORKFLOW_LIB}) target_link_libraries(client ${WORKFLOW_LIB})set_target_properties(server PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10}) set_target_properties(client PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10})

總結(jié)

以上是生活随笔為你收集整理的CMakeList笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。