在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      博客專(zhuān)欄

      EEPW首頁(yè) > 博客 > 【cmake】CMakeList添加庫(kù)|添加頭文件|添加路徑|add_executable、add_library、target_link_libraries|添加編譯選項(xiàng)|宏開(kāi)關(guān)

      【cmake】CMakeList添加庫(kù)|添加頭文件|添加路徑|add_executable、add_library、target_link_libraries|添加編譯選項(xiàng)|宏開(kāi)關(guān)

      發(fā)布人:電子禪石 時(shí)間:2022-01-26 來(lái)源:工程師 發(fā)布文章

      目錄


      官網(wǎng)查閱


      開(kāi)胃菜例子


      CMakeLists生成和添加依賴(lài)庫(kù)


      1、目錄結(jié)構(gòu)


      2、CMakeLists.txt


      3、configure and generate


      4、截圖:


      5、其他設(shè)置


      add_library(生成庫(kù)),target_link_libraries(生成目標(biāo)連接的庫(kù)),set_target_properties


      CMAKE 添加編譯選項(xiàng)|-g編譯參數(shù)/選項(xiàng)


      包含文件的的目錄include_directories


      CMake設(shè)置編譯參數(shù)/選項(xiàng)


      如何在cmakelists中加入-ldl編譯選項(xiàng)


      CMake指定gcc,g++版本編譯


      CMake 關(guān)閉警告的方法


      關(guān)閉編譯器優(yōu)化


      Debug和Release 方案


      About table


      About question


      CMakeLists 實(shí)現(xiàn)動(dòng)態(tài)宏開(kāi)關(guān)


      去掉編譯優(yōu)化


      CMake--List用法


      CmakeLists.txt單行注釋和多行注釋 


      官網(wǎng)查閱

      Search — CMake 3.22.0-rc1 Documentation


      開(kāi)胃菜例子

      生成一個(gè)可執(zhí)行程序的 CMakeList


      #添加包含文件的的目錄

      include_directories(${cppzmq_INCLUDE_DIR})             

       

      #用${SOURCE_FILES}指定的文件,生成可執(zhí)行文件sample_project 

      add_executable(sample_project ${SOURCE_FILES}) 

       

      #生成可執(zhí)行文件sample_project 需要連接 ${CMAKE_THREAD_LIBS_INIT}指定的庫(kù)

      target_link_libraries (sample_project  ${CMAKE_THREAD_LIBS_INIT}) 

       

      生成一個(gè).so動(dòng)態(tài)庫(kù)的 CMakeList 


      #用${SRC_LISTS}指定的所有的源文件生成一個(gè)庫(kù),名字叫l(wèi)ibsugan

      add_library(libsugan ${SRC_LISTS})   

       

      #生成libsugan庫(kù)需要鏈接 ${OpenCV_LIBS}、 ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so、${PROJECT_SOURCE_DIR}/lib/libInuStreams.so

      target_link_libraries(libsugan                 

          ${OpenCV_LIBS}

          ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so

          ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so

      )


      原文鏈接:https://blog.csdn.net/bandaoyu/article/details/115165199


      CMakeLists生成和添加依賴(lài)庫(kù)

      原文;cmake之生成動(dòng)態(tài)庫(kù) - mohist - 博客園


      1、目錄結(jié)構(gòu)

      │  CMakeLists.txt

      │  index.txt

      │  

      ├─build

      ├─include

      │      hello.h

      │      hi.h

      │      

      └─src

              hello.cxx

              hi.cxx

      2、CMakeLists.txt

      cmake_minimum_required(VERSION 3.1)


      #項(xiàng)目名

      project(libhello)


      # 1、指定庫(kù)的目錄變量

      set(libhello_src src/hello.cxx)

      # 指定頭文件搜索路徑

      include_directories("${PROJECT_SOURCE_DIR}/include")




      # 2、添加庫(kù)(對(duì)應(yīng)的兩個(gè)項(xiàng)目)

      add_library( hello_shared SHARED ${libhello_src})

      add_library( hello_static STATIC ${libhello_src})

      #  按照一般的習(xí)慣,靜態(tài)庫(kù)名字跟動(dòng)態(tài)庫(kù)名字應(yīng)該是一致的,只是擴(kuò)展名不同;

      # 即:靜態(tài)庫(kù)名為 libhello.a; 動(dòng)態(tài)庫(kù)名為libhello.so ;

      # 所以,希望 "hello_static" 在輸出時(shí),不是"hello_static",而是以"hello"的名字顯示,故設(shè)置如下

      # SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")



      # 3、cmake在構(gòu)建一個(gè)新的target時(shí),會(huì)嘗試清理掉其他使用這個(gè)名字的庫(kù),

      # 因此,在構(gòu)建libhello.a時(shí),就會(huì)清理掉libhello.so.

      # 為了回避這個(gè)問(wèn)題,比如再次使用SET_TARGET_PROPERTIES定義 CLEAN_DIRECT_OUTPUT屬性。

      SET_TARGET_PROPERTIES (hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)

      SET_TARGET_PROPERTIES (hello_shared PROPERTIES CLEAN_DIRECT_OUTPUT 1)



      # 4、按照規(guī)則,動(dòng)態(tài)庫(kù)是應(yīng)該包含一個(gè)版本號(hào)的,

      # VERSION指代動(dòng)態(tài)庫(kù)版本,SOVERSION指代API版本。

      SET_TARGET_PROPERTIES (hello_static PROPERTIES VERSION 1.1 SOVERSION 1)

      SET_TARGET_PROPERTIES (hello_shared PROPERTIES VERSION 1.1 SOVERSION 1)



      # 5、若將libhello.a, libhello.so.x以及hello.h安裝到系統(tǒng)目錄,才能真正讓其他人開(kāi)發(fā)使用,

      # 本例中,將hello的共享庫(kù)安裝到<prefix>/lib目錄;

      # 將hello.h安裝<prefix>/include/hello目錄。

      #INSTALL (TARGETS hello hello_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

      #INSTALL (TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

      #INSTALL (FILES hello.h DESTINATION include/hello)

      3、configure and generate

      xxx/to/path


      cd build

      cmake ..

      4、截圖:

           mac沒(méi)有電了, 來(lái)個(gè)Windows10的截圖吧:




      5、其他設(shè)置

        若需要指定輸出路徑,嘗試下面的示例指令:


      # 設(shè)置VS會(huì)自動(dòng)新建Debug和Release文件夾

      set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)

      set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)

      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Bin)


      # 設(shè)置分別設(shè)置Debug和Release輸出目錄

      set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib)

      set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib)

      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../../build/Debug)


      set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib)

      set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib)

      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/Bin)

      簡(jiǎn)單例子:


      一、生成.so共享庫(kù)文件

      下面是我的幾個(gè)文件:


      1hello.cpp


      //hello.cpp

       int Calculate_sum_Of_Two_Number(int x,int y)

      {

         int z=0;

         z=x+y;

         return (z);

      }


      2hello.hpp


      //hello.hpp

      #ifndef     __HELLO_H

      #define     __HELLO_H

      int Calculate_sum_Of_Two_Number(int x,int y);

      #endif


      3 main.cpp


      //main.cpp

      #include "hello.hpp"

      #include <stdio.h>

      int main(void)

      {

         int a=0,b=0,c=0;

         printf("please input two parameter:");

         scanf("%d",&a);

         scanf("%d",&b);

         c=Calculate_sum_Of_Two_Number(a,b);

         printf("the sum is : %d",c);

         return 0;

      }


      4 CMakeLists.txt


      #要求的Cmake最低版本

      CMAKE_MINIMUM_REQUIRED( VERSION 2.8)

       

      #工程名稱(chēng)

      PROJECT(main)

       

      #設(shè)置編譯器編譯模式:

      set( CMAKE_BUILD_TYPE "Debug" )

       

      #生成共享庫(kù)

      #get the shared package

      #here needs no .hpp

      add_library(calculate_shared SHARED  hello.cpp)

       

      #生成可以執(zhí)行的文件

      add_executable(main main.cpp)

       

      #連接共享庫(kù)

      target_link_libraries(main calculate_shared)


      上面CmakeLists.txt里面, 共享庫(kù)的名稱(chēng)是calculate_shared,這個(gè)是我們可以自己更改的。生成的可執(zhí)行文件是main, 這個(gè)名稱(chēng)也是可以更改的。


      不過(guò)需要注意的是,hello.cpp里面不用在包含hello.hpp 了。(汗,因?yàn)檫@個(gè)導(dǎo)致出錯(cuò),提示說(shuō)是重復(fù)定義函數(shù)了);


      編譯生成:


      mkdir build

      cd    build

      cmake ..

      make

      我們就可以看到build生成了 如下的文件:


      CMakeCache.txt  cmake_install.cmake     main

      CMakeFiles      libcalculate_shared.so  Makefile


       libcalculate_shared.so就是生成的共享庫(kù)文件。


      他們的路徑是:/home/fan/dev/cmake/4-exer/


      下面有build文件夾,以及main.cpp, hello.cpp, hello.hpp, 


      build文件夾下面有共享庫(kù) libcalculate_shared.so.so


      二、調(diào)用共享庫(kù)文件



      所有的外部依賴(lài)庫(kù)都是這樣的,比如opencv ,openni, eigen等等,原理是一樣的,只不過(guò)他們已經(jīng)安裝在系統(tǒng)里面了,可以查找,而這個(gè)則是需要我們自己去配置。


      即我上面生成的共享庫(kù)文件本質(zhì)上和opencv的庫(kù)是相同的。只不過(guò)這個(gè)共享庫(kù)需要自己手動(dòng)配置。


      比如我又新建了一個(gè)工程,需要調(diào)用上面的共享庫(kù) libcalculate_shared.so。


      main.cpp如下:


      //main.cpp

      #include <stdio.h>

      #include <iostream>

      #include "hello.hpp"

      using namespace std;

      int main(void)

      {

         int x=2,y=3;

         int z=0;

         z=Calculate_sum_Of_Two_Number(x,y);

         cout<<"the result is:"<<z<<endl;

         return 0;

      }


      那么在CMakeLists.txt里面,我需要告訴CMake, 這個(gè)頭文件可以在哪里找到,頭文件所定義的函數(shù)又可以在哪里找到。


      上面hello.hpp的路徑是:/home/fan/dev/cmake/4-exer/hello.hpp


      libcalculate_shared.so的路徑是/home/fan/dev/cmake/4-exer/build/libcalculate_shared.so


      則CMakeLists.txt如下:


      CMAKE_MINIMUM_REQUIRED( VERSION 2.8)

       

      PROJECT(main)

      #設(shè)置編譯器編譯模式:

      SET( CMAKE_BUILD_TYPE "Debug" )

       

      SET(HELLO_INCLUE 

          /home/fan/dev/cmake/4-exer/)

       

      SET(HELLO_SRC 

          /home/fan/dev/cmake/4-exer/build/libcalculate_shared.so)

       

      INCLUDE_DIRECTORIES(${HELLO_INCLUE})

       

      add_executable(main main.cpp)

       

      target_link_libraries(main ${HELLO_SRC})


      這里要注意一些細(xì)節(jié)(對(duì)于我這個(gè)渣渣來(lái)說(shuō)的)


      1、${   }這種形式代表一個(gè)變量,比如上面的,HELLO_INCLUE ,就是我自己定義的一個(gè)變量。


      2、頭文件包含到頭文件所在的文件夾,即 /home/fan/dev/cmake/4-exer/


      3、共享庫(kù)要指明具體的共享庫(kù) ,精確到.so


      其實(shí)主要的就是指明這個(gè)調(diào)用這個(gè)共享庫(kù)的時(shí)候,使用的頭文件,以及共享庫(kù)本身所在的位置,然后包含鏈接就可以了。


      安裝過(guò)的共享庫(kù)(例如opencv)就不用這么麻煩了,因?yàn)樗牡刂范挤旁诹俗兞坷锩妗?/p>


      Opencv的依賴(lài)添加

      比如Opencv, 它的頭文件和.so文件都已經(jīng)放在了系統(tǒng)變量里面,不用向上面自己定義了(上面例子里面的頭文件和共享庫(kù)文件的地址都是我自己設(shè)置的)


      它的CMakeLists.txt如下:


      find_package(OpenCV REQUIRED)


      include_directories(${OPENCV_INCLUDE_DIRS})


      target_link_libraries(MAIN ${OpenCV_LIBS})


      只需要查找就可以了,OpenCV_LIBS  和  OPENCV_INCLUDE_DIRS  都是系統(tǒng)幫我們已經(jīng)定義好的,所以比較容易


      參考博客:


      1、如何寫(xiě)自己的CmakeLists.txt   https://www.cnblogs.com/chaofn/p/10160555.html


      2、 【OpenCV】使用CMake鏈接自己路徑下面的OpenCV庫(kù) https://blog.csdn.net/twt520ly/article/details/81981473


      原文鏈接:https://blog.csdn.net/qq_37761077/article/details/88750711


      add_library(生成庫(kù)),target_link_libraries(生成目標(biāo)連接的庫(kù)),set_target_properties

      add_library(libsugan ${SRC_LISTS})    #用${SRC_LISTS}生成靜態(tài)庫(kù)libsugan


      target_link_libraries(libsugan      #生成靜態(tài)庫(kù)libsugan還需鏈接依賴(lài)庫(kù)${OpenCV_LIBS}…

          ${OpenCV_LIBS}

          ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so

          ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so

      )


      #上面的配置生成名字為libsugan的靜態(tài)庫(kù),但Linux下對(duì)庫(kù)的存儲(chǔ)格式是lib+name.a,所以庫(kù)libsugan存儲(chǔ)出來(lái)的結(jié)果就是liblibsugan.a,看著很別扭。用下面這句,保證了存儲(chǔ)出來(lái)的靜態(tài)庫(kù)叫做libsugan.a:


      set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")


      #但是請(qǐng)千萬(wàn)注意,在整個(gè)CmakeLists.txt里


      #如果想鏈接生成的這個(gè)庫(kù)必須使用    “add_library(libsugan ${SRC_LISTS})”指明的名字。

      set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")


      add_executable(demo ./src/main.cpp)

      target_link_libraries(demo libsugan)


      原例子:


      add_library,target_link_libraries,set_target_properties,target_link_libraries使用聯(lián)系_michaelhan3的博客-CSDN博客


      #工程名字

      project(Camera_sugan)                  

       

      #編譯最低cmake版本

      cmake_minimum_required(VERSION 2.6)    

       

      #設(shè)置c++編譯器

      set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )  

       

      #在整個(gè)電腦上找opencv包

      find_package(OpenCV REQUIRED)    

       

      #包含頭文件路徑

      include_directories(             

          ./include/inudev/

          ./src/

      )

       

      #將所有的源文件列為一個(gè)集合,集合名字叫做SRC_LISTS

      set(SRC_LISTS                   

          ./src/inuitive.cpp

          ./src/runCamera_Qfeeltech.cpp

      )

       

      #將集合里的所有的源文件生成一個(gè)靜態(tài)庫(kù),該靜態(tài)庫(kù)的名字libsugan,

      注意,在整個(gè)CmakeLists里都要用libsugan這個(gè)

      add_library(libsugan ${SRC_LISTS})   

       

      #名字來(lái)代替之前那個(gè)集合生成的庫(kù)。

      target_link_libraries(libsugan    #鏈接靜態(tài)庫(kù)需要的依賴(lài)庫(kù)

          ${OpenCV_LIBS}

          ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so

          ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so

      )


      原文鏈接:https://blog.csdn.net/michaelhan3/article/details/69568362


      CMAKE 添加編譯選項(xiàng)|-g編譯參數(shù)/選項(xiàng)

      add_definitions 和add_compile_options,二者添加的編譯選項(xiàng)是針對(duì)所有編譯器的(包括c和c++編譯器)。


      add_definitions 和add_compile_options的區(qū)別是:


      add_definitions 可用于添加任何標(biāo)志,但旨在添加預(yù)處理器定義。


      此命令已被替代方案取代:

      使用 add_compile_definitions() 添加預(yù)處理器定義。

      使用 include_directories() 添加包含目錄。

      使用 add_compile_options() 添加其他選項(xiàng)。


      add_definitions — CMake 3.22.0-rc1 Documentation


      添加 -g編譯參數(shù)/選項(xiàng)


      方法一:add_definitions("-g")/ add_compile_options



      在文件 CMakeLists.txt添加下面一條語(yǔ)句

      add_definitions("-g")


      添加其他編譯參數(shù)/選項(xiàng)


      例如下面的代碼


      #判斷編譯器類(lèi)型,如果是gcc編譯器,則在編譯選項(xiàng)中加入c++11支持


      if(CMAKE_COMPILER_IS_GNUCXX)

          add_compile_options(-std=c++11)

          message(STATUS "optional:-std=c++11")   

      endif(CMAKE_COMPILER_IS_GNUCXX)

       




      使用add_compile_options添加-std=c++11選項(xiàng),是想在編譯c++代碼時(shí)加上c++11支持選項(xiàng)。但是因?yàn)閍dd_compile_options是針對(duì)所有類(lèi)型編譯器的,所以在編譯c代碼時(shí),就會(huì)產(chǎn)生如下warning


      J:\workspace\facecl.gcc>make b64

      [ 50%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cdecode.c.obj

      cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C

      [100%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cencode.c.obj

      cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C

      Linking C static library libb64.a

      [100%] Built target b64

      雖然并不影響編譯,但看著的確是不爽啊,要消除這個(gè)warning,就不能使用add_compile_options,而是只針對(duì)c++編譯器添加這個(gè)option。


      方法二:set


      所以如下修改代碼,則警告消除。


      #判斷編譯器類(lèi)型,如果是gcc編譯器,則在編譯選項(xiàng)中加入c++11支持

      if(CMAKE_COMPILER_IS_GNUCXX)

          set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")

          message(STATUS "optional:-std=c++11")   

      endif(CMAKE_COMPILER_IS_GNUCXX)



      原文鏈接:https://blog.csdn.net/qinglongzhan/article/details/80743731


      包含文件的的目錄include_directories

      include_directories(${cppzmq_INCLUDE_DIR})  //添加包含文件的的目錄


      add_definitions 可用于添加任何標(biāo)志,但旨在添加預(yù)處理器定義。


      此命令已被替代方案取代:

      使用 add_compile_definitions() 添加預(yù)處理器定義。

      使用 include_directories() 添加包含目錄。

      使用 add_compile_options() 添加其他選項(xiàng)。


      CMake設(shè)置編譯參數(shù)/選項(xiàng)

      而set命令設(shè)置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS變量則是分別只針對(duì)c和c++編譯器的


      對(duì)c編譯器的


      set(CMAKE_C_FLAGS"-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14")


      針對(duì)c++編譯器的


      set(CMAKE_CXX_FLAGS "-O3 -fopenmp -fPIC -Wno-deprecated -Wenum-compare -std=c++14")


      如何在cmakelists中加入-ldl編譯選項(xiàng)

      cmakelists.txt中,在增加可執(zhí)行程序后增加TARGET_LINK_LIBRARIES

      eg:



      add_executable(xx ${ALL_F} ${WE_F})

      TARGET_LINK_LIBRARIES(dl)

      TARGET_LINK_LIBRARIES(m)


      set(CMAKE_C_FLAGS "-ldl")


      在add_executable(${PROJECT_NAME} "main.cpp")后面添加

      target_link_libraries(${PROJECT_NAME} dl)


      target_link_libraries(exe1 -Wl, - -whole-archive lib1 -Wl, -  no-whole-archive)

      CMake指定gcc,g++版本編譯

      系統(tǒng)默認(rèn)的gcc/g++在/usr/bin目錄下。


      我們升級(jí)安裝的gcc目錄在/usr/local/bin目錄下,現(xiàn)在我們希望使用升級(jí)后的gcc。


      通過(guò)百度搜索出來(lái)的結(jié)果,大多是如下操作:


      在CMakeLists.txt中調(diào)用編譯器之前添加:


      1


      2


      SET(CMAKE_C_COMPILER "/usr/local/bin/gcc")


      SET(CMAKE_CXX_COMPILER "/usr/local/bin/g++")


      然而經(jīng)過(guò)本人親自實(shí)踐,該方法不起作用,正確的做法是:


      執(zhí)行cmake命令之前,在shell終端先設(shè)置如下兩個(gè)變量:


      1


      2


      export CC=/usr/local/bin/gcc


      export CXX=/usr/local/bin/g++


      然后再執(zhí)行cmake等后續(xù)命令,這樣就可以用指定的編譯器版本了。


      【已解決】CMake指定gcc,g++版本編譯 | 勤奮的小青蛙


      CMake 關(guān)閉警告的方法

      在CMakeLists.txt中添加add_definitions(-w)


      應(yīng)用于單個(gè)target


        if(CMAKE_COMPILER_IS_GNUCC)

       target_compile_options(main PRIVATE"-Wall")

       endif()

       if(MSVC)

       target_compile_options(main PRIVATE"/ W4")

       endif()

        

      應(yīng)用于所有target


        if(CMAKE_COMPILER_IS_GNUCC)

       set(CMAKE_CXX_FLAGS"$ {CMAKE_CXX_FLAGS} -Wall")

       endif()

       if(MSVC)

       set(CMAKE_CXX_FLAGS"$ {CMAKE_CXX_FLAGS} / W4")

       endif()

        

      注意:為GCC或/ WX添加-Werror以便MSVC將所有警告視為錯(cuò)誤。這會(huì)將所有警告視為錯(cuò)誤。這對(duì)于新項(xiàng)目來(lái)說(shuō)可以方便地執(zhí)行嚴(yán)格的警告。


      另外, -Wall 并不意味著"所有錯(cuò)誤";從歷史意義上講,它意味著"每個(gè)人都可以達(dá)成一致的所有錯(cuò)誤""。從 -Wall -Wextra 開(kāi)始,然后仔細(xì)閱讀您的版本的GCC手冊(cè),并找到 else 編譯器可以為您提供關(guān)于警告的信息。


      CMake和編譯器警告 - IT屋-程序員軟件開(kāi)發(fā)技術(shù)分享社區(qū)


      關(guān)閉編譯器優(yōu)化

      (未驗(yàn)證)


      1)add_compile_options(-fno-elide-constructors)    #關(guān)閉編譯器優(yōu)化


      2)set(CMAKE_CXX_FLAGS "-fno-elide-constructors ${CMAKE_CXX_FLAGS}")


      Debug和Release 方案

      About table

      Configurations in terms of gcc/clang compilers (CMake 3.4.1):


      Debug: -g

      Release: -O3 -DNDEBUG

      RelWithDebInfo: -O2 -g -DNDEBUG

      MinSizeRel: -Os -DNDEBUG

      It means:


        +---------------+--------------+--------------+----------+

        |               | optimization | assert works | stripped |

        +---------------+--------------+--------------+----------|

        |     Debug     |     no       |     yes      |    no    |

        |    Release    |    full      |      no      |   yes    |

        | RelWithDebInfo|    good      |      no      |    no    |

        |   MinSizeRel  |    size      |      no      |   yes    |

        +---------------+--------------+--------------+----------+

      So I don't agree with your MinSizeRel description because in this case I think both MinSizeRel and Release are stripped.


      About question

      As far as I understand you want no extra flags at all (no -g, -O* or -DNDEBUG). For Makefile-like generators:


      > cmake -H. -B_builds -DCMAKE_BUILD_TYPE=MyConf -DCMAKE_CXX_FLAGS_MYCONF=""

      > cmake --build _builds

      CMakeLists 實(shí)現(xiàn)動(dòng)態(tài)宏開(kāi)關(guān)

      去掉編譯優(yōu)化

      在CMakeList中添加:


      if(NOT CMAKE_BUILD_TYPE)

        set(CMAKE_BUILD_TYPE Release)

      endif()

       

      set(CMAKE_CXX_FLAGS "-Wall -Wextra")

      set(CMAKE_CXX_FLAGS_DEBUG "-g")

      set(CMAKE_CXX_FLAGS_RELEASE "-O3")

      執(zhí)行的時(shí)候


      cmake  -DCMAKE_BUILD_TYPE=Release


      也可以在上一層(調(diào)用本CMakeList.txt的)的CMakeList.txt中添加下面:


      option (CMAKE_BUILD_TYPE "Use tutorial provided math implementation"  ON)


      表示啟用CMAKE_BUILD_TYPE 宏。


      option (CMAKE_BUILD_TYPE "Use tutorial provided math implementation"  OFF) #表示關(guān)


      參考:


      c++ - Optimize in CMake by default - Stack Overflow


      debugging - How to compile without optimizations -O0 using CMake - Unix & Linux Stack Exchange


      例子


      最近在工作中需要通過(guò)一份C代碼控制邏輯走向,網(wǎng)上找了一下資料,發(fā)現(xiàn)可以通過(guò)在CMakeLists文件中動(dòng)態(tài)定義宏開(kāi)關(guān),從而能夠達(dá)到編譯出不同邏輯流的代碼。


      具體步驟:


      首先,我在src代碼里編寫(xiě)了若干debug的輸出:


      #IFDEF DEBUG

       

          some print command;

       

      #ENDIF

      然后,在CMakeLists文件中添加DEBUG的定義:


      IF (CMAKE_BUILD_TYPE STREQUAL DEBUG)

          ADD_DEFINITIONS(-DDEBUG)

      ENDIF()

      最后,在cmake的時(shí)候設(shè)置參數(shù) -DCMAKE_BUILD_TYPE 為 DEBUG:


      $ cmake .. -DCMAKE_BUILD_TYPE=DEBUG

      $ make -j4

      這樣再運(yùn)行可執(zhí)行文件時(shí)就會(huì)打印出some print command的debug信息了。如果不想看到debug信息,只需在參數(shù)中不設(shè)置DEBUG參數(shù),或者將DEBUG參數(shù)設(shè)置為其它值即可(以下兩種方式二者選其一):


      $ cmake ..

      $ cmake .. -DCMAKE_BUILD_TYPE=RELEASE

      到此 CMakeLists 實(shí)現(xiàn)動(dòng)態(tài)宏開(kāi)關(guān)介紹完成。


      原文鏈接:https://blog.csdn.net/qq_19734597/article/details/104461963


      CMake--List用法

      CMake--List用法 - narjaja - 博客園


      CmakeLists.txt單行注釋和多行注釋 

      單行注釋?zhuān)菏褂谩?”

      多行注釋?zhuān)菏褂谩?[[ ]]”


      ————————————————

      版權(quán)聲明:本文為CSDN博主「bandaoyu」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

      原文鏈接:https://blog.csdn.net/bandaoyu/article/details/115165199


      *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

      DIY機(jī)械鍵盤(pán)相關(guān)社區(qū):機(jī)械鍵盤(pán)DIY




      關(guān)鍵詞: cmake

      技術(shù)專(zhuān)區(qū)

      關(guān)閉