導航:首頁 > 源碼編譯 > cmake編譯geos

cmake編譯geos

發布時間:2022-08-18 12:36:36

Ⅰ 如何使用CMake進行交叉編譯

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 怎麼樣編譯庫的時候加其他庫

編譯mac靜態庫
這個比較簡單,直接Xcode -GXcode,然後用xcodebuild命令即可。
編譯Andoird靜態庫
編譯android庫我們同樣可以引入一個toolchain文件,這里我是從 android-cmake 裡面下載的。
在使用這個toolchain文件之前,我們先要使用ndk自帶的make-standalone-toolchain.sh腳本來生成對應平台的toolchain.這個腳本位於你的NDK的路徑下面的buil/tools目錄下。
比如要生成arm平台的toolchain,我們可以使用下列命令:

sh $ ANDROID_NDK / build / tools / make - standalone - toolchain . sh -- platform = android - $ANDROID_API_LEVEL -- install - dir = . / android - toolchain -- system = darwin - x86_64 -- ndk - dir = /Users / guanghui / AndroidDev / android - ndk - r9d / -- toolchain = arm - linux - androideabi - 4.8

這里的$ANDROID_NDK為你的NDK的安裝路徑。這段命令可以生成arm的toolchain,最終可以編譯出armeabi和armeabi-v7a靜態庫。 如果想生成x86的toolchain,指需要使用下列命令:

sh $ ANDROID_NDK / build / tools / make - standalone - toolchain . sh -- platform = android - $ANDROID_API_LEVEL -- install - dir = . / android - toolchain - x86 -- system = darwin - x86_64 -- ndk - dir= / Users / guanghui / AndroidDev / android - ndk - r9d / -- toolchain = x86 - 4.8

最後,我們要告訴CMake使用外部toolchain文件,可以使用參數-DCMAKE_TOOLCHAIN_FILE=xxx。此外,我們還需要在導出兩個環境變數給此toolchain文件:

export PATH = $ PATH : . / android - toolchain / bin
export ANDROID_STANDALONE_TOOLCHAIN = . / android - toolchain
cmake - DCMAKE_TOOLCHAIN_FILE = . . / android . toolchain . cmake - DANDROID_ABI = "armeabi" . .

Ⅲ Windows平台cmake-gui應用,具體怎麼編譯求大神幫助

通過『開始』>『所有程序』>『CMake 2.』8>『CMake』來運行CMake(CMake-GUI)(這里假定在簡體中文Windows中運行2.8版本)
在"Where is the source code"文本框中,輸入或者「browse」到源代碼的根目錄
在"Where to build the binaries" 文本框中,輸入或者「browse」到輸出文件夾
單擊屏幕下方的'Configure'按鍵。
選擇你的目標編譯平台,例如"Visual Studio 10 2010"
當系統提示是否創建構建目錄的時候選擇'Ok'
等待configure執行結束。
屏幕上現在會有一些配置設置,並用紅色標記(這是用來指出你是第一次看到他們)。你可以在這裏手動配置這些選項,不過現在我們只需要再次選擇'Configure'。
等運行結束了選擇"Generate"按鍵。

構建文件將會在你之前選擇的文件夾下面產生,這時候就可以退出cmake來進行真正的編譯工作。

Ⅳ cmake很簡單的故障問題,怎麼解決

1.開始的時候著實折騰了好長時間,一直以為是代碼的問題,所以就在代碼中進行了跟蹤,結果怎麼都找不到問題,後來就是這份代碼,直接make後,替換原有的系統的協議庫,發現代碼沒有問題,排除了代碼問題。這個問題花時間很久大概有一天時間。
2.發現是編譯方式不同導致的問題後,對兩個文件進行了對比,發現使用Cmake編譯出來的可執行文件是「no stripped」,以為是這個原因,後來就解決strip可執行文件的問題,在網上又是一頓狂找,最終使用「add_custom_command」定製命令的方式得到了解決,滿心歡喜的看到所有應用文件都stripped了,滿心以為這下可好了,但是替換以後仍然通訊異常,這個過程大概花了半天時間。
3.問題得不到解決很郁悶,繼續對比兩個文件的差異,發現即使是stripped以後,使用CMake編譯出來的的文件仍然比直接使用Makefile文件make出來的文件要大不少,這些得到了一些啟示,去看了下Makefile文件。通過查看Makefile和對比CMakeLists.txt文件發現,Makefile中的編譯採用的宏控制,輸出的是Release版本,而CMakeLists.txt中默認的輸出Debug版本。找到問題所在了以後,直接又從網上找到「SET(CMAKE_BUILD_TYPE Release ON)」的方式進行了Release版本設置。
4.後來還發現CMakeLists.txt中的編譯選項也是採用的默認方式,而Makefile中卻有使用,所以乾脆就直接將編譯選項也直接拿過來。
SET(CMAKE_C_FLAGS "-O2 -pipe -fPIC -Wall -fmessage-length=0")
SET(CMAKE_CXX_FLAGS "-O2 -pipe -fPIC -Wall -fmessage-length=0")

5.然後直接進行了編譯,看到編譯後的應用果然文件大小又小了很多,這下覺得沒有問題了,進行整體更換,reboot系統,查看模擬器與設備的通訊情況,正常。ok,這一天算是沒有白費,將正常後的CMakeLists.txt都更新到svn中。

Ⅳ 編譯器cmake 和g++的區別

Cmake是一個make工具,它可以根據makefile文件來調用你和編譯器進行多個文件的編譯和鏈接。用Cmake生成的就是使用你本地的編譯器來編譯生成那些文件。

Ⅵ 如何使用CMAKE生成makefile文件

CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性。只是 CMake 的組態檔取名為 CmakeLists.txt。Cmake 並不直接建構出最終的軟體,而是產生標準的建構檔(如 linux 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然後再依一般的建構方式使用。
在 linux 平台下使用 CMake 生成 Makefile 並編譯的流程如下:
編寫 CmakeLists.txt。
執行命令 「cmake PATH」 或者 「ccmake PATH」 生成 Makefile ( PATH 是 CMakeLists.txt 所在的目錄 )。
使用 make 命令進行編譯
工程實例:
一. 編寫各層CMakeLists.txt
主目錄的主程序main.cpp
#include "hello.h"
extern Hello hello;
int main()
{
hello.Print();
return 0;
}
主目錄的CMakeLists.txt
# to the root binary directory of the project as ${MAIN_BINARY_DIR}.
project (MAIN)
#version support
cmake_minimum_required(VERSION 2.8)
# Recurse into the "Hello" and "Demo" subdirectories. This does not actually
# cause another cmake executable to run. The same process will walk through
# the project's entire directory structure.
add_subdirectory (Hello)
add_subdirectory (Demo)
# Make sure the compiler can find include files from our Hello library.
include_directories (${MAIN_SOURCE_DIR}/Hello)
# Make sure the linker can find the Hello Demo library once it is built.
link_directories (${HELLO_BINARY_DIR}/Hello)
link_directories (${HELLO_BINARY_DIR}/Demo)
#define the source coedes of current directory as DIR_SRCS
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# Add executable called "MAIN" that is built from the source files
add_executable (Main ${DIR_SRCS})
# Link the executable to the Hello Demo library.
target_link_libraries (Main Hello Demo)
定義項目名project(MAIN),使得當前目錄可以用${MAIN_SOURCE_DIR},由於有2個子目錄,所以需要add_subdirectory它們。由於主程序會使用到其他庫,因而也需要指定連接庫所在目錄。
主目錄下的作用是利用add_executable將當前目錄下的源文件編譯成Main程序,然後通過target_link_libraries鏈接Hello和Demo庫。由於主程序文件使用了hello.h文件,所以要include_directories該目錄。
---------------------------------------------------------------------------------------------------
子目錄Demo的子程序demo.c
#include "hello.h"
Hello hello;
子目錄Demo的CMakeLists.txt
# Make sure the compiler can find include files from our Hello library.
include_directories (${MAIN_SOURCE_DIR}/Hello)
#define the source coedes of current directory as DIR_DEMO_SRCS
AUX_SOURCE_DIRECTORY(. DIR_DEMO_SRCS)
# Add library called "Demo" that is built from the source files
add_library (Demo ${DIR_DEMO_SRCS})
Demo目錄下的CMakeLists主要作用是利用add_library將當前目錄源碼編譯成Demo庫,由於該庫使用到hello.h文件,所以要include_directories該目錄。
---------------------------------------------------------------------------------------------------
子目錄Hello的子程序hello.h
#ifndef _hello_h
#define _hello_h
class Hello
{
public:
void Print();
};
#endif
子目錄Hello的子程序hello.c
#include "hello.h"
#include <stdio.h>
void Hello::Print()
{
printf("Hello, World!\n");
}
子目錄Hello的CMakeLists.txt
#define the source coedes of current directory as DIR_HELLO_SRCS
AUX_SOURCE_DIRECTORY(. DIR_HELLO_SRCS)
# Add library called "hello" that is built from the source files
add_library (Hello ${DIR_HELLO_SRCS})
Hello目錄下的CMakeLists主要作用是利用add_library將當前目錄源碼編譯成Hello庫。
---------------------------------------------------------------------------------------------------
二. 執行cmake命令
至此我們完成了項目中所有 CMakeLists.txt 文件的編寫,進入目錄 step2 中依次執行命令
#cmake .
默認當前目錄,生產makefile
#make
最後編譯程序

Ⅶ cmake 如何編譯成debug版

回復 7# qfmeal 這些參數是make工具的,--debug 只會讓make在調用編譯器gcc/g++幹活的時候列印更多的東西,讓你看到它詳細的分析和處理指令的過程。

Ⅷ 編譯安裝cmake時的問題怎麼解決

使用opencv需要編譯源碼,得到庫文件。可以用cmake構建項目後編譯,也可以直接用官方提供的編譯好的版本。 官方提供的編譯庫一般只是標准版本,沒有附加某些庫,比如tbb等,要想讓opencv使用tbb等庫,就只能自己構建項目後編譯。 當然,一般使用的話,用官方提供的庫即可。OpenCV2.3.1版本就提供編譯好的庫,可以直接設置使用。

Ⅸ cmake怎麼編譯visual studio win32

點擊"configure"按鈕。選擇要使用的集成開發環境(IDE)。Windows系統選擇"Visual Stud

注釋:
即使您不進行交叉編譯,也必須規定一個工具鏈文件。

6
如果某些配置欄位為紅色,請再次點擊"configure"按鈕。所有欄位都應該為灰色。
點擊OK。
Windows系統下,在您的構建目錄里會生成一個可打開的.sln文件。

7
編譯範例項目。在Linux或Mac里,只需"cd"到構建目錄,並鍵入"make"。

注釋:
您可以隨時重置項目。操作時,刪除構建目錄的內容並重新啟動CMake。
請勿編輯Visual Studio Project,因為它是實時生成的(詳情請參見Cmake的程序說明書)。可以通過編輯Cmake文件來進行配置。

閱讀全文

與cmake編譯geos相關的資料

熱點內容
歌詞滾動效果android 瀏覽:14
程序員一天的六場戰斗 瀏覽:797
自製壓縮泵的做法 瀏覽:622
androidstring變數 瀏覽:247
數學乘法速演算法 瀏覽:986
壓縮包製作後照片順序怎麼改 瀏覽:680
fibonacci數列演算法 瀏覽:775
產品經理要和程序員吵架嗎 瀏覽:252
grub2命令行 瀏覽:618
無法獲取加密卡信息 瀏覽:774
雲伺服器網卡充值 瀏覽:509
編程就是軟體 瀏覽:49
伺服器如何添加許可權 瀏覽:437
引用指針編程 瀏覽:851
手機加密日記本蘋果版下載 瀏覽:64
命令行括弧 瀏覽:176
java程序升級 瀏覽:490
排序演算法之插入類 瀏覽:227
gcccreate命令 瀏覽:73
海爾監控用什麼app 瀏覽:64