編譯方法概述
① 如何在windows上用ndk交叉編譯其他平台程序
目標 :編譯arm64的.so庫
編譯方法:理論上應該有兩種交叉編譯方法,法一,在linux伺服器上安裝交叉工具鏈,直接用交叉工具鏈進行編譯鏈接;法二,使用ndk完成交叉編譯,因為
ndk已經安裝好交叉編譯工具鏈,以及相關的系統庫和系統頭文件了。這兩種方法的區別在於,linux伺服器上的編譯使用的makefile和ndk使用的.mk
文件顯然不同。原因是ndk作為一個集成編譯環境,制定了一套特定的規則用於生成最終的編譯腳本。
這里簡單總結下,如何在windows用ndk進行交叉編譯arm64目標平台的.so庫:
step1:找到ndk開發工具包,官網之類的都可以下載,Android-ndk64-r10-windows-x86_64.rar文件
step2:解壓上述ndk工具包,將包含程序源文件和頭文件的文件夾testProject都放入android-ndk-r10下的samples目錄下。
放在其他地方當然也可以,但是後續相對路徑之類的不太好加,既然其他例子都放這,把代碼放這編譯是最保險的了。
step3:在testProject中增加一個jni的文件夾,必須要添加!!!!!!
step4:在jni文件夾中,添加一個Android.mk的文件,必須要添加!!!!!
step5:在jni文件夾中,添加一個Application.mk的文件與Android.mk並列,必須要添加!!!!!
step6:Android.mk和Application.mk合起來就類似於linux環境下的makefile編譯文件。
如何寫Android.mk,可以參考例子helllo-jni中jni文件夾下的Android.mk。
LOCAL_PATH:=$(call my-dir) #必須要寫的
include $(CLEAR_VARS) #必須要寫的
LOCAL_MODULE:=hello-jni #編譯出來的模塊名稱
LOCAL_SRC_FILES:=hello-jni.c #制定編譯的源文件名稱
include $(BUILD_SHARED_LIBRARY)#放在最後
除了上述變數之外,還有其他的指定的變數,
LOCAL_CFLAGS,用於指定編譯選項,這個和makefile中是完全一樣的,可以指定編譯選項-g,也可以指定編譯宏及宏值
LOCAL_LDLIBS,用於指定鏈接的依賴庫,這個可以makefile也是完全一樣的,可以指定鏈接庫用-l庫名,以及指定庫搜索路徑用_L路徑名
LOCAL_STATIC_LIBRARIES,指定鏈接的靜態庫名,makefile中沒有
LOCAL_C_INCLUDES,用於指定編譯頭文件的路徑,和makefile中不同,路徑前不需要加-I,直接寫路徑即可,可以是相對路徑或絕對路徑,
多個路徑之間用空格隔開。
編寫上述Android.mk碰到的問題有,
(1)使用默認的系統自動載入stl庫頭文件總是出錯,只好手動在LOCAL_STATIC_LIBRARIES指定sources/cxx-stl/stlport/stlport來完成對#include<string>這種c++形式的頭文件載入
(2)使用$(SYSROOT)/usr/include來完成對系統庫頭文件的載入,結果找不到sem_t符號,只好指定platforms/android-L/arch-arm64/usr/include
step7:Application.mk編寫
APP_STL指定使用的stl移植庫,動態或者靜態都行
APP_CPPFLAGS,指定app編譯的編譯選項
APP_ABI指定abi規范類型,例如arm64-v8a,也可以寫成ALL就是把所有的類型全部編一編
APP_PLATFORM指定編譯的platform名稱,這里可以寫成android-L或者不指定全編。
step8:編譯完成後,運行。
啟動cmd,使用cd /D進行到testProject的jni目錄下
step9:將android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此時直接敲回車,就可以編譯了。當然也可以加一個 clean,清除編譯中間文件。
step10:檢查下編譯結果,編譯成功後在testProject中多了兩個文件夾與jni並列的,libs和obj。
編譯鏈接後的結果就在libs中!
② 計算機常用幾種語言編譯方法
計算機語言的編譯方法主要有三種:解釋器、編譯器和即時編譯器。解釋器逐行編譯源代碼,無需生成可執行文件,運行時效率較低。編譯器將整個源代碼編譯成機器指令,生成可執行文件,運行速度更快。即時編譯器結合了解釋器和編譯器的特性,編譯速度中等,運行速度比解釋器快,比編譯器慢。
計算機常用編譯方法
計算機語言的編譯方法主要有:
1. 解釋器
解釋器逐行讀取源代碼,並將其逐行轉換為機器指令。與編譯器不同的是,解釋器在運行時執行編譯過程,因此不需要生成可執行文件。
2. 編譯器
編譯器將整個源代碼翻譯成機器指令,並生成可執行文件。可執行文件可以在不使用編譯器的情況下直接在計算機上運行。編譯器編譯代碼的速度較慢,但生成的代碼運行速度更快。
3. 即時編譯器(JIT)
即時編譯器結合了解釋器和編譯器的特性。它先將源代碼編譯成一種中間格式,稱為位元組碼,然後在運行時將位元組碼動態編譯成機器指令。JIT 編譯器比解釋器速度更快,但比編譯器速度慢。
編譯方法的比較
特性解釋器編譯器即時編譯器速度慢快中等效率低高中等內存使用大小中等可移植性高低中等開發速度快慢中等
選擇編譯方法
選擇哪種編譯方法取決於具體情況。
如果需要快速開發和快速迭代,則解釋器可能是更好的選擇。如果需要高性能和效率,則編譯器可能是更好的選擇。如果需要介於兩者之間的折中方案,則即時編譯器可能會是更好的選擇。
③ Qt三方庫開發技術(一):QuaZIP介紹、編譯和使用
QuaZIP是一個由Gilles Vollant提供的ZIP/UNZIP軟體包的簡單C++封裝,旨在方便Qt項目訪問ZIP檔案。以下是關於QuaZIP的介紹、編譯和使用方法的詳細說明:
一、QuaZIP介紹
- 功能:QuaZIP提供了對ZIP文件的訪問功能,包括壓縮和解壓縮。
- 依賴:它依賴於zlib庫,因此在編譯和使用QuaZIP時,需要確保zlib庫的頭文件和庫文件可用。
- 平台兼容性:QuaZIP已在多個平台上測試,包括Linux、FreeBSD、HPUX和Windows。
二、編譯QuaZIP
安裝zlib庫:
- 在編譯QuaZIP之前,需要確保已經正確安裝了zlib庫。
- 在Windows上,由於Qt5的特定需求,可能還需要單獨安裝zlib庫。
下載QuaZIP源代碼:
- 訪問QuaZIP的官方頁面,下載所需版本的源代碼。
使用CMake配置項目:
- 使用CMake工具進行配置和生成項目。
- 確保正確設置了Qt版本,並添加了zlib庫路徑。
在Qt Creator中編譯項目:
- 使用Qt Creator打開QuaZIP源代碼的pro文件。
- 確保在pro文件中正確指定了zlib庫的路徑。
- 編譯項目,生成QuaZIP庫文件。
三、使用QuaZIP
包含頭文件:
- 在需要使用QuaZIP的Qt項目中,包含必要的QuaZIP頭文件。
創建QuaZipManager實例:
- 創建QuaZipManager對象,用於管理ZIP文件的操作。
調用方法操作ZIP文件:
- 使用QuaZipManager提供的方法,如getZipFileList,來獲取ZIP文件中的文件列表。
- 示常式序中,通過調用getZipFileList方法,輸出了指定ZIP文件中的文件列表。
驗證結果:
- 運行示常式序,查看輸出結果。
- 如果輸出結果顯示了從指定ZIP文件中檢索到的文件列表,則表明QuaZIP已成功安裝並能正常工作。
總結:QuaZIP提供了一個簡潔、易於使用的介面,用於在Qt項目中處理ZIP文件。通過遵循上述步驟,可以成功地安裝和使用QuaZIP庫,實現對ZIP文件的壓縮和解壓縮功能。
④ 「編譯方式」和「解釋方式」的區別
程序員編寫的程序現在一般都是用高級語言編寫的,如c/c++ 以及面向對象的visual 系列;這樣編寫的程序計算機是不能直接執行的,因為計算機只能執行二進製程序。因此要經過一個源程序代碼翻譯成二進制的過程。計算機並不能直接地接受和執行用高級語言編寫的源程序,源程序在輸入計算機時,通過「翻譯程序」翻譯成機器語言形式的目標程序,計算機才能識別和執行。這種「翻譯」通常有兩種方式,即編譯方式和解釋方式。
兩者的區別如下:
解釋方式:程序運行時,取一條指令,將其轉化為機器指令,再執行這條機器指令。這種方式每次運行程序時都要重新翻譯整個程序,效率較低,執行速度慢,如QB,不過現在很少再用這種低效的方式的設計語言了。
編譯方式:程序運行時之前,將程序的所有代碼編譯為機器代碼,再運行這個程序。然後每次執行的時候就可以直接執行這個翻譯好的二進制文件了,這樣的程序只需要翻譯一次,效率明顯要高很多,現在的大多數語言都是這種方式,網頁中的asp.net 採用的也是這種方式。
簡單的說,編譯就是全文翻譯,全部翻譯完才執行。解釋就相當於同聲翻譯,邊翻譯邊執行。