① cmake編譯單/多文件
在該路徑下會生成一個文件夾(CMakeFiles),三個文件(Makefile, CMakeCache.txt, cmake_install.cmake)以及一個程序(addition)
此時的文件目錄結構為
該項目該依賴於MPI,GDAL和cereal庫。MPI和GDAL庫自行編譯
1.配置各種編譯的時候,可以使用set設置,更多詳情,請自行搜索。
2.頭文件的包含請使用include_directories。
3.搜索源文件請使用aux_source_directory。
4.第三脊滾基方庫的查找使用 find_package。例如我們想找GDAL, 那麼 find_package(GDAL), 它會在 /usr/share/cmake/Moles 文件中的FindGDAL.cmake文件中去找GDAL的各種信息。前提是GDAL 是make install的, FindGDAL.cmake中才會有GDAL的各種信息。否則的話,我們需要set自行制定GDAL的相關信息。
5.第三方庫的鏈接用target_link_libraries。
注意,也櫻謹可以將該項目中的某個文件夾編譯成靜態庫,然備隱後在於其餘源文件鏈接,可以參考: https://blog.csdn.net/cliukai/article/details/90670243
簡單的多文件編譯: https://blog.csdn.net/cliukai/article/details/90670243
有第三方庫的文件編譯: https://blog.csdn.net/fb_help/article/details/79593037
② 怎麼配置cmakelist交叉編譯
cmake交叉編譯配置
很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。
CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。
toolChain腳本中設置的幾個重要變數
1.CMAKE_SYSTEM_NAME:
即你目標機target所在的操作系統名稱,比如ARM或者linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.
2. CMAKE_C_COMPILER:
顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。
3. CMAKE_CXX_COMPILER:
同上,此時代表的是C++編譯器。
4. CMAKE_FIND_ROOT_PATH:
指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)
該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。
5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER
6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:
對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.
7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:
對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
8. BOOST_ROOT:
對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。
9. QT_QMAKE_EXECUTABLE:
對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)
toolChain demo
# this is required
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。
③ 編譯安裝cmake時的問題怎麼解決
使用opencv需要編譯源碼,得到庫文件。可以用cmake構建項目後編譯,也可以直接用官方提供的編譯好的版本。 官方提供的編譯庫一般只是標准版本,沒有附加某些庫,比如tbb等,要想讓opencv使用tbb等庫,就只能自己構建項目後編譯。 當然,一般使用的話,用官方提供的庫即可。OpenCV2.3.1版本就提供編譯好的庫,可以直接設置使用。
④ cmake中怎樣設置gcc的編譯參數
在configure的時候,加上–host=arm-linux,結果沒有實現我們要的效果,沒有將編譯器從默認的 gcc改成arm-linux-gcc,編譯器還是用的默認的gcc: [crifan@localhost lrzsz-0.12.20]$ CFLAGS=-O2
⑤ Mac+VScode配置CMake編譯HelloWorld
請自行安裝
回車後就可以看到已經初始化了一個Cmake工程及其CMakeLists.txt文件+main.cpp文件。build目錄只是編譯產出物,可以刪除後通過 mkdir build && cd build && cmake .. 重新生成。
F1 打開控制台。
打開終端
⑥ 使用CMake編譯C/C++程序
CMake Tutorial
CMake Reference
定義程序編譯規則
生成可執行文件的最簡單版本的 CMakeLists.txt
以上CMakeLists.txt定義的編譯規則是將源文件tutorial.c編譯成名為 Tutorial 的可執行文件。
一般用法是,新建一個文件夾,一般命名為 build ,在終端進入該文件夾,然後調用 cmake ../ , cmake 會在找到上級目錄找到 CMakeLists.txt ,生成 makefile 和一些其它文件。
在 makefile 所在目錄,調用 make 命令,會根據 makefile 對程序進行編譯生成。
⑦ 如何使用cmake編譯軟體項目3
1. 在主程序所在目錄的CMakeLists.txt中定義要編譯的主程序和輸出的可執行文件名:
#定義主程序名稱
add_executable(輸出的可執行文件名稱 源文件列表)
#定義鏈接庫
target_link_libraries(輸出的可執行文件名稱 鏈接庫1 鏈接庫2 ...)
2.在庫文件所在目錄中的CMakeLists.txt中告訴cmake將其所有庫文件編譯成動態庫:
#通過set命令自定義變數LIB_SRC包括那些源文件,這些文件將編譯到動態庫
set (LIB_SRC
libsrc1.cpp
libsrc2.cpp
libsrc3.cpp
)
#將上述文件編譯到庫中
add_library (庫名稱 SHARED ${LIB_SRC})
#定義庫的輸出位置, 如果在根目錄下的CMakeLists.txt中已經定義,此處可注釋掉。
set(LIBRARY_OUTPUT_PATH 具體的目錄位置)
⑧ cmake 添加編譯選項的幾種方式
This is initialized for each language from environment variables:
Flags for language <LANG> when building for the <CONFIG> configuration.
SET(CMAKE_C_FLAGS_DEBUG "-g -D_DEBUG -O0")
SET(CMAKE_C_FLAGS_RELEASE "-g -DNDEBUG -O3")
SET(CMAKE_CXX_FLAGS_DEBUG "-g -D_DEBUG -O0")
SET(CMAKE_CXX_FLAGS_RELEASE "-g -DNDEBUG -O3")
⑨ Android Studio手動配置Makefile、CMake
在Ubutu上編譯出來的.so文件,怎麼添加到Android項目中去使用呢?目前:可以通過
Makefile方式和CMake方式引入預編譯靜動態庫(靜態庫.a 動態庫.so)到項目中去使用。就目前而言CMake是Goole推薦使用方式,但是加入接手一個老的NDK項目是MakeFile方式,看不懂就GePi了,所以這里我們還是介紹一下MakeFile方式將靜動態庫加入到AS中,完成NDK項目的開發。廢話不多說,直接擼步驟了:
1、在src/main目錄下創建一個ndkBuild文件夾
2、在此文件中創建一個Android.mk文件
3、在此文件中創建一個test.c的源文件
4、將編譯好的的.so庫復制到src/main目錄下
如圖所示目錄結構:
1、編輯Android.mk文件
2、編輯grade(app)文件
3、編輯test.c文件
4、使用編譯好的.so庫裡面的函數
本結果運行在Android 5.1 系統上
再次運行在Android 8.0系統上
看以清楚知道,其實我們的APK包裡面就沒有libMainTest.so庫,所以APP在8.0上會出現奔潰的現象。so...
1、在src/main目錄下創建一個cmake文件夾
include:裡麵包含需要一些頭文件
cmakeTest.c:需要編譯的源文件
2、在app目錄下創建一個文件:CmakeLists.txt
3、編輯grade(app)
4、編輯cmakeTest.c文件
4、引用編譯好的libcmakeTest.so
Android 8.0.0系統:
Android 5.1.1系統: