A. 編譯器如何通過頭文件找到庫文件,為什麼要用頭文件作中介
首先糾正一下,編譯器並不通過頭文件找源文件,頭文件里只有聲明,include是在預處理階段,就是直接把頭文件代碼粘貼到你寫的.c文件中,接下來編譯器編譯生成目標文件,你說的庫文件我的理解應該是頭文件對應的源文件吧,這個過程其實是發生在鏈接階段,頭文件對應的源文件早就編譯成目標文件做成靜態鏈接庫或者動態鏈接庫,和你寫的目標文件一起鏈接成可執行程序
第二個問題 為什麼用頭文件做中介
前面已經說過頭文件里只有聲明,試想一下如果不用頭文件,聲明和定義都放在一個文件中,那麼你去include庫文件的時候他會把裡面所有的函數聲明和函數原型都包含進來,一個庫文件中可能包含幾十個函數,而這些函數你可能只用到其中的一兩個,一個函數有可能幾百行代碼,這樣你的.c文件不是額外多了好幾千行代碼
B. 如何使用android的ndk編譯器 編譯c++的庫
1. 概述 首先回顧一下 Android NDK 開發中,Android.mk 和 Application.mk 各自的職責。 Android.mk,負責配置如下內容: (1) 模塊名(LOCAL_MODULE) (2) 需要編譯的源文件(LOCAL_SRC_FILES) (3) 依賴的第三方庫(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES) (4) 編譯/鏈接選項(LOCAL_LDLIBS、LOCAL_CFLAGS) Application.mk,負責配置如下內容: (1) 目標平台的ABI類型(默認值:armeabi)(APP_ABI) (2) Toolchains(默認值:GCC 4.8) (3) C++標准庫類型(默認值:system)(APP_STL) (4) release/debug模式(默認值:release) 由此我們可以看到,本文所涉及的編譯選項在Android.mk和Application.mk中均有出現,下面我們將一個個詳細介紹。 2. APP_ABI ABI全稱是:Application binary interface,即:應用程序二進制介面,它定義了一套規則,允許編譯好的二進制目標代碼在所有兼容該ABI的操作系統和硬體平台中無需改動就能運行。(具體的定義請參考 網路 或者 維基網路 ) 由上述定義可以判斷,ABI定義了規則,而具體的實現則是由編譯器、CPU、操作系統共同來完成的。不同的CPU晶元(如:ARM、Intel x86、MIPS)支持不同的ABI架構,常見的ABI類型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。 這就是為什麼我們編譯出來的可以運行於Windows的二進製程序不能運行於Mac OS/Linux/Android平台了,因為CPU晶元和操作系統均不相同,支持的ABI類型也不一樣,因此無法識別對方的二進製程序。 而我們所說的「交叉編譯」的核心原理也跟這些密切相關,交叉編譯,就是使用交叉編譯工具,在一個平台上編譯生成另一個平台上的二進制可執行程序,為什麼可以做到?因為交叉編譯工具實現了另一個平台所定義的ABI規則。我們在Windows/Linux平台使用Android NDK交叉編譯工具來編譯出Android平台的庫也是這個道理。 這里給出最新 Android NDK 所支持的ABI類型及區別: 那麼,如何指定ABI類型呢?在 Application.mk 文件中添加一行即可: APP_ABI := armeabi-v7a //只編譯armeabi-v7a版本 APP_ABI := armeabi armeabi-v7a //同時編譯armeabi,armeabi-v7a版本 APP_ABI := all //編譯所有版本 3. LOCAL_LDLIBS Android NDK 除了提供了Bionic libc庫,還提供了一些其他的庫,可以在 Android.mk 文件中通過如下方式添加依賴: LOCAL_LDLIBS := -lfoo 其中,如下幾個庫在 Android NDK 編譯時就默認鏈接了,不需要額外添加在 LOCAL_LDLIBS 中: (1) Bionic libc庫 (2) pthread庫(-lpthread) (3) math(-lmath) (4) C++ support library (-lstdc++) 下面我列了一個表,給出了可以添加到「LOCAL_LDLIBS」中的不同版本的Android NDK所支持的庫: 下面是我總結的一些常用的CFLAGS編譯選項: (1)通用的編譯選項 -O2 編譯優化選項,一般選擇O2,兼顧了優化程度與目標大小 -Wall 打開所有編譯過程中的Warning -fPIC 編譯位置無關的代碼,一般用於編譯動態庫 -shared 編譯動態庫 -fopenmp 打開多核並行計算, -Idir 配置頭文件搜索路徑,如果有多個-I選項,則路徑的搜索先後順序是從左到右的,即在前面的路徑會被選搜索 -nostdinc 該選項指示不要標准路徑下的搜索頭文件,而只搜索-I選項指定的路徑和當前路徑。 --sysroot=dir 用dir作為頭文件和庫文件的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜索頭文件,在/usr/lib下搜索庫文件,它將用dir/usr/include和dir/usr/lib替代原來的相應路徑。 -llibrary 查找名為library的庫進行鏈接 -Ldir 增加-l選項指定的庫文件的搜索路徑,即編譯器會到dir路徑下搜索-l指定的庫文件。 -nostdlib 該選項指示鏈接的時候不要使用標准路徑下的庫文件 (2) ARM平台相關的編譯選項 -marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集 -march=name 指定特定的ARM架構,常用的包括:-march=armv6, -march=armv7-a -mfpu=name 給出目標平台的浮點運算處理器類型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16 -mfloat-abi=name 給出目標平台的浮點預算ABI,支持的參數包括:「soft」, 「softfp」 and 「hard」
C. 我想用C++寫一些DLL類庫文件用什麼編譯器好
我這里有我寫的一些C\C++編寫的DLL庫,和調用方法的簡單例子。。。。
郵箱:[email protected]
D. 如何查看執行文件或者庫文件的編譯器版本
可以看到編譯器版本 。 簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言
E. C/C++編譯器如何通過頭文件鏈接到對應的庫文件
把自己的頭文件存為*.h文件名。然後在要調用該頭文件的程序開頭用
#include
<*.h>如果你指的是包含一個你編譯器沒有的第三方頭文件的話,那麼首先檢查該頭文件代碼是否被編譯器支持,如果支持的話使用#include包含她就可以了。
F. 很多編譯器都有個LIB文件夾,裡面有很多.lib文件,它們的作用是什麼
.lib文件是程序的二進制庫文件,編譯器連接程序是一般會用到.
如:
main()
{
printf("abc");
}
在這個程序中,你是不用編寫輸出函數代碼的,直接調用printf()函數的就可以輸出字元串了.printf()函數的二進制代碼就是在.lib文件中,只是程序編譯後,把它的二進制代碼加到了本常式序中.
在TC2.0下,.lib文件可以用tlib.exe程序建立.
G. 庫文件在都什麼情況下被編譯器搜索連接
不行,必須先include。然後只要你extern了,就會自動連接過去
H. c\c++:文件和庫文件有什麼區別
著要看你從哪一個層次來提問.
1.編碼方式不同。
一般文件採用通常的UTF8編碼格式,這種編碼編碼是國際標准,所以在不同的系統上都能看到我們想要的字元。庫文件的編碼格式由系統提供,不同的系統的庫文件編碼格式不同。LINUX下的動態庫文件是.so,靜態庫是.a,WINDOWS動態庫是.dll,他們內部的二進制排列順序不同。
2.文件頭標志不同,例如圖片文件.png格式的文件開頭的16進制標志是:8950 4e47 0d0a 1a0a ,其他文件也有自己的文件頭標識。他們不同的編碼方式需要採用不同的演算法來解壓數據。
另外,如果你只是在問C/C++編譯時的文件和庫文件的區別,請看下面:
普通的文件例如stdio.h只是最普通的文本文件(只要普通的文本文件就能查看),編譯器在編譯一個單元時,編譯器要求鏈接器根據所包含的頭文件去鏈接庫文件,使得頭文件內部的函數定義,(和其他各種定義)找到對應的位置。這樣就形成了可以運行的二進制文件。庫文件是編譯器之前就編譯好的程序(他是庫,包含了函數定義,類型定義,以及一些最通用的變數,例如C++的std::cout對象),這樣避免每次編譯都要從頭編譯這些相同的函數,同時減小了最終程序的文件大小,動態庫是作為多個程序共享的,這可以避免每個程序都含有某個重復的部分。
你的問題提的有點模糊,所以先回答你的這些吧
I. 4399的c++運行庫和我學習的編譯器,電腦里的編譯器有什麼關系
運行庫是運行時所需要的庫文件,你的編譯器是編譯你所寫的程序,兩個沒什麼關系
J. 怎樣建立mplab ide編譯器可以使用的庫文件
首先,你用的C18編譯器只能編譯PIC高端的8位單片機PIC18系列單片機。
不建議初學者開始就先學PIC18單片機,建議先學PIC10、PIC12、PIC16系列單片機。如需要編譯C文件,可以在Microchip的官網下載HT-PICC for PIC12/16那個。
但也不建議初學者開始學就用C編寫。如果你不了解單片機內部結構和指令(指令就是匯編),那你永遠也沒法學懂單片機(不管是否PIC的)。
啰嗦的話說完了,現在說一下你的問題。裝好以後,先要建立好一個項目,在建立項目的時候需要你指定編譯器,則找到Microchip C18 toolsuite,並且確認下面的編譯器和連接器的路徑都指向MCC18目錄下。
建立好項目後,載入的頭文件不是PIC.H(這個是PIC12/16系列的頭文件),而是你用什麼單片機則載入什麼頭文件,比如說PIC18F4680這款單片機,那就載入PIC18F4680.H這個文件需要注意的是並不是所有的單片機都有「自己名字.H」這樣的文件,你需要查看具體的單片機的數據手冊,這可以在Microchip網站上免費下載。
然後還需要把對應的LIB文件載入上比如說PIC18F4680.LIB,還有對應lkr文件,比如PIC18F4680.lkr。
還需要配置的是「Project」—》「Build Options」—》「Project」,在在彈出的對話框中找到「Directories」標簽,看到一個Show directories for:旁邊的下拉選項,分別找到「Include Search Path」「Library Search Path」「Linker-Script Search Path」,這三個選項,這三個分別是指定頭文件目錄(Mcc18\h)、Lib庫文件目錄(Mcc18\lib)和LKR目錄(Mcc18\bin\lkr)的。點擊那個「New」按鈕建立路徑。
如果還不行,把編譯的錯誤信息發給我看看。
不過如果你是為了長期從事PIC單片機開發的話,我還是建議你先學PIC12、PIC16,並先學匯編開始。不管單片機還是計算機,不都是從匯編指令開始學起的么!