導航:首頁 > 源碼編譯 > cmake靜態編譯

cmake靜態編譯

發布時間:2022-01-15 10:14:23

1. 如何使用cmake生成基於靜態庫的動態鏈接庫

在工程搭建時,可能會有將靜態庫鏈接成動態庫的需求,如出於代碼保護的角度,某些模塊會發布.a擴展名的靜態庫,我們要將多個這樣的靜態庫鏈接成一個動態
庫。但與直接link目標文件不同的是,ld以默認參數執行時,並把靜態庫中沒有用到的函數過濾掉,導致生成的so並未包含所要的函數,因此要加上
--whole-archive參數,以保證所有的函數都包含在生成的so中。

在使用cmake時,CMakeLists.txt的寫法如下:

add_library(
${MODULE_NAME}
SHARED
${CMAKE_SOURCE_DIR}/builttime.c #要生成一個so,至少要包含一個源文件,實在沒有可以把庫的編譯時間戳打到這兒。
)

target_link_libraries(
${MODULE_NAME}
${${MODULE_NAME}_EXTRA_LDFLAGS}
"-Wl,--whole-archive" #告訴編譯器,從這里開始,所有的庫的內容都包含到so中
${LOCAL_MODULES} #可以是以源代碼生成的靜態庫
${PREBUILT_MODULES} #可以是預先生成的靜態庫
"-Wl,--no-whole-archive" #告訴編譯器,從這里開始,以後的庫的內容不用都包含到so中
)

2. ubuntu 執行了cmake後為什麼無法執行make

首先去官網下載安裝包,選擇「XX.tar.gz」源碼安裝包

輸入如下命令
$tar -zxvf xx.tar.gz
$./bootstrap
$make
$make install
輸入以上命令後就已經可以在ubuntu上安裝好cmake
編寫簡單的cmake
使用cmake首先得有個CMakeList.txt文件,你需要把配置信息寫在該文件中,然後通過cmake去處理該文件。
將設有下面一個main.cpp文件
//main.cpp文件
#include<iostream>
using namespace std;
int main(){
cout<<"hello world!"<<endl;
return 0;
}1234567

這時候我們就可以寫個如下的CMakeList.txt文件
#cmake最小需要版本
cmake_minimum_required(VERSION 2.8)

#項目名字
project(HELLOWORLD)

#包含原程序,即把給定目錄下的源程序復制給變數DIR_SRC
aux_source_directory(DIR_SRC ./)

#生成程序
add_executable(helloworld ${DIR_SRC})1234567891011

然後執行如下命令
$mkdir build
$cd build
$cmake ..
$make
$./helloworld
這樣就編譯好程序並運行。
添加靜態庫或者動態庫
而假設我們程序用到了在/usr/lib下的一個靜態庫libmy.a,那就需要添加如下兩個命令
#庫所在位置
link_directories(/usr/lib)

#程序編譯時候鏈接庫
target_link_libraries(helloworld my)12345

3. 如何才能使CMake生成的可執行程序便於調試

出現的原因是導入的此makefile工程不是debug模式的,所以不包含調試信息,自然不能打斷點調試了。因此,要解決這個問題就要考慮如何修改CMakeLists.txt使其生成的makefile文件進而生成Debug模式下的帶調試信息的可執行程序;
我們先寫一個簡單的測試例子來測試一下,如何加調試信息:
假設文件結構如下:

./test6
|
+ ------ CmakeLists.txt
+ ------ main.cpp

+ ------ src_a
|
+ ------ CmakeLists.txt
+ ------ Testa.h
+ ------ Testa.cpp

+ ------ src_so
|
+ ------ CmakeLists.txt
+ ------ Testso.h
+ ------ Testso.cpp

第一步:test6目錄下CmakeLists.txt

cmake_minimum_required(VERSION 3.3)

project(main )

add_subdirectory(src_a ) // 給當前工程目錄添加子目錄 src_a
add_subdirectory(src_so ) // 給當前工程目錄添加子目錄 src_so

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息

set(EXECUTABLE_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置可執行文件的生成路徑

include_directories($ {PROJECT_SOURCE_DIR}/src_a ${PROJECT_SOURCE_DIR}/src_so) //包含庫頭文件

aux_source_directory(. DIR_SRCS ) // 將當前目錄中的源文件名稱賦值給變數 DIR_SRCS
add_executable(main $ {DIR_SRCS}) //表示 DIR_SRCS中的源文件需要編譯成名為 main的可執行文件

target_link_libraries (main Testa Testso) //將庫文件鏈接到生成的目標可執行文件

第二步:子目錄目錄下CmakeLists.txt
1,src_a中靜態庫的編譯生成

cmake_minimum_required(VERSION 3.3) //該命令限定了 CMake 的版本

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息

set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置Lib 靜態庫生成路徑

aux_source_directory(. LIBA_SRC) //將當前目錄中的源文件名稱賦值給變數 LIBA_SRC
add_library(Testad STATIC $ {LIBA_SRC}) //將變數 LIBA_SRC中的源文件編譯為靜態庫,庫文件名稱為 Testa

2,src_so中動態庫的編譯生成

cmake_minimum_required(VERSION 3.3) //該命令限定了 CMake 的版本

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加調試信息

set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //設置Lib 動態庫庫生成路徑

aux_source_directory(. LIBSO_SRC) //將當前目錄中的源文件名稱賦值給變數 LIBA_SRC
add_library(Testsod SHARED $ {LIBSO_SRC}) //將變數 LIBA_SRC中的源文件編譯為動態庫,庫文件名稱為 Testso

此處執行cmake時有兩種方式:

1,在cmake的gui界面中設定生成Debug模式,
2,在執行cmake時使用如下命令:cmake -DCMAKE_BUILD_TYPE=Debug/Release path

關於ccmake的使用,這里簡單的做個說明:
1.首先在終端啟動cmake的gui界面:"ccmake ." 效果如圖:

2.然後在gui中輸入"c",效果如圖:

3.然後在gui中輸入"e",效果如圖:

4.此時在gui界面點擊"enter"回車鍵進行編輯:編輯完再次點擊回車退出編輯。

5.點擊"c",之後再次點擊"g"。此時makefile文件已經生成好了。make之後生成的可執行文件是帶有調試信息的,就可用gdb進行調試了(導入Eclipse也可以進行打斷點調試)。

4. cmake編譯opencv程序的時候怎麼靜態編譯

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

5. 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" . .

6. linux裡面安裝的cmake 軟體到底是干什麼用的啊

CMake是一個跨平台的安裝(編譯)工具,可以用簡單的語句來描述所有平台的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。只是
CMake
的組態檔取名為
CmakeLists.txt。Cmake
並不直接建構出最終的軟體,而是產生標準的建構檔(如
Unix

Makefile

Windows
Visual
C++

projects/workspaces),然後再依一般的建構方式使用。這使得熟悉某個集成開發環境(IDE)的開發者可以用標準的方式建構他的軟體,這種可以使用各平台的原生建構系統的能力是
CMake

SCons
等其他類似系統的區別之處。
CMake
可以編譯源代碼、製作程式庫、產生適配器(wrapper)、還可以用任意的順序建構執行檔。CMake
支持
in-place
建構(二進檔和源代碼在同一個目錄樹中)和
out-of-place
建構(二進檔在別的目錄里),因此可以很容易從同一個源代碼目錄樹中建構出多個二進檔。CMake
也支持靜態與動態程式庫的建構。
「CMake」這個名字是「cross
platform
make」的縮寫。雖然名字中含有「make」,但是CMake和Unix上常見的「make」系統是分開的,而且更為高階。

7. CMAKE怎麼編譯LAPACK

1. 首先去下載源代碼 2. 如果是Fortran寫的,參考,將源碼編譯成動態鏈接庫,記得下載幾個用來導出庫函數的頭文件;如果是C寫的,直接用VS編譯成靜態或者動態鏈接庫,需要注意的是,LAPACK函數的編譯需要多線程run time的支持; 3. 在程序中指定

8. cmake如何將兩個相互依賴的靜態庫合並為一個

a 文件的結構和.tar文件就沒有什麼區別。 x 命令解出來, a 命令添加, t命令列表
假設A.a, B.a C.a 在/usr/local/lib目錄下
mkdir /tmp/libABC
cd /tmp/libABC
ar x /usr/local/lib/A.a
ar x /usr/local/lib/B.a
ar x /usr/local/lib/C.a
ar cru libABC.a *.o
ranlib libABC.a

9. windows下怎麼使用cmake生成.a的靜態庫

您好,很高興為您解答:
在使用cmake時,CMakeLists.txt的寫法如下: add_library( ${MODULE_NAME} SHARED ${CMAKE_SOURCE_DIR}/builttime.c #要生成一個so,至少要包含一個源文件,實在沒有可以把庫的編譯時間戳打到這兒。 ) target_link_libraries( ${MODULE_NAME} ${${MODULE_NAME}_EXTRA_LDFLAGS} "-Wl,--whole-archive" #告訴編譯器,
從這里開始,所有的庫的內容都包含到so中 ${LOCAL_MODULES} #可以是以源代碼生成的靜態庫 ${PREBUILT_MODULES} #可以是預先生成的靜態庫 "-Wl,--no-whole-archive" #告訴編譯器,從這里開始,以後的庫的內容不用都包含到so中 )

10. 怎麼用CMake編譯freeglut

1、解開freeglut-3.0.0的壓縮包,用記事本打開目錄樹下的「README.cmake」文件,下載Binary distributions。

2、下載好,解開其壓縮包後,找到可執行文件,cmake-3.2.2-win32-x86/bin/cmake-gui.exe,運行之,

3、在兩個where後邊填上目錄樹的路徑(注意不是src的路徑,本文以R:/freeglut-3.0.0為例),點擊configure按鈕,彈出如下的對話框,從中選擇所需的開發環境:

4、這里支持的環境好多,選擇需要的環境,然後點擊Finish,它會開始檢查這個環境,然後給出一些配置選項:

5、從中修改靜態庫目標的安裝位置(本例安裝在R:/freeglut_static),勾掉不需要的選項(比如Demo、動態連接庫等),點擊Generate,即可生成工程。
6、打開工程後,找到工程設置,在此可以按照自己的需要修改一些配置,實際上絕大多數都不必動,有可能需要修改的也就是這么個地方:

7、這個按照自己的需要選擇單線程運行庫或是多線程運行庫,或是多線程的DLL版運行庫,主要是為了防止和別的庫或者別的工程的設置沖突。
然後批量編譯:

8、勾掉不必要的選項,比如MinSizeRel是在Release版本的基礎上,改成最小尺寸優化的版本;RelWithDebInfo是在Release版本的基礎上,添加調試信息的版本。這倆版本的可以不要。然後,點擊Rebuild All,編譯完就可以在安裝目錄下找到最終文件了。

閱讀全文

與cmake靜態編譯相關的資料

熱點內容
工作三年的大專程序員 瀏覽:728
java畢業設計文獻 瀏覽:143
籌碼集中度指標源碼 瀏覽:482
listsortjava 瀏覽:186
plc閃光電路編程實例 瀏覽:299
socket編程試題 瀏覽:206
華為的伺服器怎麼設置從光碟機啟動 瀏覽:871
程序員真的累嗎 瀏覽:328
學信網app為什麼刷臉不了 瀏覽:874
天蠍vs程序員 瀏覽:996
單片機下載口叫什麼 瀏覽:190
程序員的道 瀏覽:926
雲伺服器不實名違法嗎 瀏覽:558
怎樣查看文件夾圖片是否重復 瀏覽:995
文件怎麼導成pdf文件 瀏覽:808
打開sql表的命令 瀏覽:103
安卓手機如何面部支付 瀏覽:38
天元數學app為什麼登錄不上去 瀏覽:825
明日之後為什麼有些伺服器是四個字 瀏覽:104
安卓系統l1是什麼意思 瀏覽:26