查詢編譯鏈
一般是用的GNU的那一套工具鏈 比如你寫了一個源碼為main.c 然後gcc main.c即可,生成的a,out為可執行的ELF文件。 如果你需要了解GCC的詳解資料,最好讀一下它的man pages
『貳』 關於c/c++中 編譯鏈接的問題。
這個問題不是一兩句話可以解釋完
1、微軟提供給我們的MFC已經編譯成靜態LIB和動態LIB,同時,為方便調試,微軟將MFC源碼(CPP文件)也放到VC里一起發布了;這里會存在兩種情況,如果是靜態LIB,那麼功能代碼會在鏈接時鏈接進你的EXE文件中,所以這種靜態LIB方式時,EXE文件通常都比較大;如果是動態LIB的方式,那麼運行的時候就需要mfcxxx.dll文件,但EXE文件體積比較小
2、如果你理解了1,我再進一步解釋,MFC工程配置的時候默認會鏈接mfcxxx.lib的,所以你的工程里只需要包含對應的頭文件,例如 afxxxx.h之類的文件即可,編譯器在編譯階段是不需要知道具體實現代碼在哪裡的,它只需要知道聲明即可編譯通過,同時編譯器會將那些外部的函數(即不是在當前CPP文件實現的函數)標記為需要修復的(我們先把它叫做修復吧);那麼,假如我用了一個MFC的函數,現在我只有聲明,它是怎麼找到具體的實現代碼呢,這就是鏈接器的工作了,剛才我說過,MFC工程默認是會鏈接mfcxxx.lib的,所以鏈接器在工作的時候,它會遍歷所有編譯過的文件,從裡面找出要修復的項,然後再遍歷LIB文件,如果在LIB文件里找到對應的實現,那麼鏈接器會把編譯階段留下的手尾FIX掉
3、如果你理解了2,我們再進一步解釋2;鏈接器鏈接LIB的時候,會有兩種情況,第一種,這個LIB本身是一個靜態LIB,包含了具體的實現;第二種,這個LIB本身只是一個中介,它是指向DLL的某個函數的;對於第一種情況,鏈接器會把用到的所有代碼鏈接進去,注意,在Release版本情況下,鏈接器只會把用的的函數鏈進去,就是說,即使你的靜態LIB有10MB,你也不需要擔心編譯出來的EXE有10MB,它只會把用到的函數鏈進去;;對於第二種,是指向DLL某個函數的,鏈接器會在EXE的PE部里的導入表部分,增加一個項,這個項指向DLL的函數,同時在修復編譯階段留下手尾的地方,讓它JMP(跳轉)或CALL(調用)到我們DLL函數里
以上純屬個人解釋,因為在編譯鏈接階段是非常復雜的,一時間沒辦法完全解決齊,有問題可以繼續追問
『叄』 用c語言寫的並編譯連接好的程序如何查看其代碼
可以看到匯編代碼,目前還沒有工具可以直接反編譯成C代碼.
『肆』 linux下如何查看.a.so文件是由什麼文件編譯連接
linux下如何查看.a.so文件是由什麼文件編譯連接
so文件就是通常說的動態鏈接庫,就跟windows下的dll文件差不多。
ko是內核模塊文件,驅動之類的啥的。
不過在linux系統下文件的後綴多數情況下只是個標識,有可能代表不了文件的真實屬性的。
至於怎麼編寫,就跟用VS編譯dll或者lib文件差不多,把你的代碼編譯完成以後命名為相應的後綴就好了。
我了解的一般都是C程序,java屬於腳本語言,程序多數情況下是被解釋執行的,所以一般不需要編譯成庫。至於如何編譯成庫文件,如果你在windows下做過開發的話應該不用我解釋太多。實在不知道的話可以再問我哈~~
希望以上回答能對你有所幫助。
『伍』 怎麼查看交叉編譯工具鏈是glibc
在編輯工具當中我們看一下具體的連接操作方式,然後進入高級查看模式,就可以看到是否是glibc操作模式。
『陸』 交叉編譯工具鏈製作的問題!
核心轉儲是崩潰報告的一個過程,他只是把當前崩潰的信息轉存出來方便差錯。而且這個核心轉儲幾個字也不過是個提示輸出信息。這個提示不會給與任何與錯誤相關的內容,必須看其他的錯誤信息或者他轉儲出來的東西來分析。
不過核心轉儲,應該是程序運行出錯而崩潰。這種問題出現在你正在運行的程序,而不是編譯過程出現的編譯錯誤(也就是說,出現核心轉儲應該就是 GCC 或者他調用的程序自己崩潰了)。出現這個問題的原因很多。
如果是因為沒有找到某些 header 文件,不應該是核心轉儲錯誤,而是編譯器或者某個過程提示錯誤信息後退出,他會輸出錯誤信息告訴你問題所在。
至於你編譯的這些東西版本都比較老,我建議還是嘗試降級整個系統來編譯、運行你現在的這些東西。或者升級你這個交叉編譯工具鏈到當前主流的版本來用。
至於交叉工具連當中的 GCC 和你當前本機的 GCC,完全是兩個互相獨立的 GCC 。
只是他們編譯輸出的二進製程序針對的指令集不同而已。相對的 binutils 和 glibc 和 kernel-header 都是一樣的意思,針對目標而輸出的相關程序。當然 glibc 和 kernel-header 主要是以「數據」方式存在,gcc 和 binutils 主要是以可以運行的程序方式存在(當然不是絕對的,比如 gcc 還會提供幾個 lib 相關的內容,不過大部分情況下你可以這么理解更直觀了解他們的作用)。
一般說來 GCC 是編譯器,binutils 是連接器,glibc 是標准 C 庫(主要是連接時,連接器必須有目標的函數庫文件,也就是 .so 文件,對應 Windows 是 .dll 文件。連接器把函數調用正確的掛接到對應的函數入口上)。linux header 就是 C 語言常見的 C header 文件和相關的開發數據。一般主要用來編譯 glibc ,glibc 作為中間層來提供內核相關調用。當然程序有些時候也會直接調用內核函數,這樣這些程序在編譯時也需要 kernel 的 header 。
這兩套東西一個輸出你當前 PC 的程序,一個輸出 ARM 的程序。兩個 GCC 套裝之間不能互相替換。只能自己輸出屬於自己的程序。
但是這兩套程序雖然輸出的程序不同,但可以運行的部分,卻都是在你的計算機上運行。而且你本機的 GCC 因為可以輸出本機的程序。所以你需要用他來輸出在你本機運行,但是卻輸出 ARM 程序的 GCC 套裝。
這就好比兩個錘子,一個錘子用來打鐵,一個錘子用來打錫。用途不同,但這兩個錘子都是鐵做的。
你作這個交叉編譯工具鏈,就是用你手裡已經有的打鐵的錘子,打出一個用鐵製作的用來打錫的錘子。這個打錫的錘子是不能打鐵的,同樣這個打鐵的錘子是不能用來打錫的。
『柒』 如何查看一個dll是用什麼編譯器編譯的
dll文件是系統的動態鏈接庫文件,可以用一些十六位春文本編輯器打開,如UltraEdit
修改DLL文件的方法
1、下載DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
2、獲取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll這幾個鏈接文件。在找這幾個文件時,最好將其他機器的硬碟,掛接在本機中,然後用本機的操作系統啟動並復制這幾個文件。
3、在修改DLL文件的時候,打開該鍵值,在右面的對話框中將所要修改的鍵值禁用即可,不要刪除,以備日後恢復
『捌』 怎樣檢查linux交叉工具鏈 安裝成功
配置好PATH環境變數(加入你交叉編譯工具鏈的目錄),比如你arm交叉工具鏈,可能名字叫arm-linux-gcc。執行arm-linux-gcc -v,如果看到如上圖所示提示版本信息,基本上就算安裝成功了吧。GOOD LUCK~
『玖』 怎麼查看Android編譯時候交叉編譯鏈工具位置
經常搞嵌入式開發的朋友對於交叉編譯環境應該並不陌生,說白了,就是一組運行在x86 PC機的編譯工具,可以讓你在PC機上編譯出目標平台(例如ARM)可識別的二進制文件。Android平台也提供了這樣的交叉編譯工具鏈,就放在Android的NDK開發包的toolchains目錄下,因此,我們的Makefile文件中,只需給出相應的編譯工具即可。
廢話就先說到這,直接上例子,我們目標是把下面這個math.c文件編譯成一個靜態庫文件:
#include <stdio.h>
int add( int a , int b ) {
return a+b;
}
你需要編寫一個Makefile文件,這里假設你的Android ndk被安裝在 /opt/android/ndk 目錄下,當然,你可以根據自己的實際情況修改Makefile中相關路徑的定義,Makefile文件示例如下:
# Makefile Written by ticktick
# Show how to cross-compile c/c++ code for android platform
.PHONY: clean
NDKROOT=/opt/android/ndk
PLATFORM=$(NDKROOT)/platforms/android-14/arch-arm
CROSS_COMPILE=$(NDKROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
CFLAGS = -I$(PWD) -I$(PLATFORM)/usr/include -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
LDFLAGS =
『拾』 怎麼查linux的交叉工具鏈版本
如果交叉編譯工具鏈的路徑已經添加到path變數中的話,直接使用... -v即可查看
比如我的是arm-linux-gnueabihf-g++
那麼直接arm-linux-gnueabihf-g++ -v或者是--version就可以得到版本信息了。