導航:首頁 > 源碼編譯 > crt編譯過程

crt編譯過程

發布時間:2023-01-13 22:22:23

1. 我用QT軟體做了一個記事本,但用CRT軟體運行可執行文件說無法找到文件,我想知道問題出在哪一步。老師說

1、首先你需要交叉編譯你的Qt工程,(就是編譯一個能在你的開發板系統運行的程序)
2、將編譯好的文件通過CRT的rz命令傳入進去,前提是你的ARM系統支持rz傳輸功能。
3、載入開發板系統中Qt的環境變數,然後運行你的程序就行了!

2. CRT軟體如何使用

最近看了周星星 Blog 中的一篇文章:「VC 6.0中內存泄漏檢測」,受益匪淺,便運行其例子代碼想看看 Output 窗口中的輸出結果,可惜怎麼弄其輸出都不是預期的東西,郁悶了半天,便到水壇里找到周星星,請求他指點一、二,然而未果。沒有辦法,最後我一頭栽進 MSDN 庫狂搜了一把,功夫不負有心人,我搜出很多有關這方面的資料,沒過多久我便基本上就找到了答案......
首先,檢測內存泄漏的基本工具是調試器和 CRT 調試堆函數。為了使用調試堆函數,必須在要檢測內存泄漏和調試的程序中添加下面的語句:

#define _CRTDBG_MAP_ALLOC

#include<stdlib.h>

#include<crtdbg.h>

#include "debug_new.h"
MSDN 如是說:「必須保證上面聲明的順序,如果改變了順序,可能不能正常工作。」至於這是為什麼,我們不得而知。MS 的老大們經常這樣故弄玄虛。
針對非 MFC 程序,再加上周星星的頭文件:debug_new.h,當然如果不加這一句,也能檢測出內存泄漏,但是你無法確定在哪個源程序文件中發生泄漏。Output 輸出只告訴你在 crtsdb.h 中的某個地方有內存泄漏。我測試時 REG_DEBUG_NEW 沒有起作用。加不加這個宏都可以檢測出發生內存分配泄漏的文件。
其次,一旦添加了上面的聲明,你就可以通過在程序中加入下面的代碼來報告內存泄漏信息了:

_CrtDumpMemoryLeaks();
這就這么簡單。我在周星星的例子代碼中加入這些機關後,在 VC 調試會話(按 F5 調試運行) Output 窗口的 Debug 頁便看到了預期的內存泄漏 mp。該 mp 形式如下:
Detected memory leaks!

Dumping objects ->

c:\Program Files\...\include\crtdbg.h(552) : {45} normal block at 0x00441BA0, 2 bytes long.

Data: <AB> 41 42

c:\Program Files\...\include\crtdbg.h(552) : {44} normal block at 0x00441BD0, 33 bytes long.

Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD

c:\Program Files\...\include\crtdbg.h(552) : {43} normal block at 0x00441C20, 40 bytes long.

Data: < C > E8 01 43 00 16 00 00 00 00 00 00 00 00 00 00 00

Object mp complete.
更具體的細節請參考本文附帶的源代碼文件。

下面是我看過 MSDN 資料後,針對「如何使用 CRT 調試功能來檢測內存泄漏?」的問題進行了一番編譯和整理,希望對大家有用。如果你的英文很棒,那就不用往下看了,建議直接去讀 MSDN 庫中的技術原文。
C/C 編程語言的最強大功能之一便是其動態分配和釋放內存,但是中國有句古話:「最大的長處也可能成為最大的弱點」,那麼 C/C 應用程序正好印證了這句話。在 C/C 應用程序開發過程中,動態分配的內存處理不當是最常見的問題。其中,最難捉摸也最難檢測的錯誤之一就是內存泄漏,即未能正確釋放以前分配的內存的錯誤。偶爾發生的少量內存泄漏可能不會引起我們的注意,但泄漏大量內存的程序或泄漏日益增多的程序可能會表現出各種 各樣的徵兆:從性能不良(並且逐漸降低)到內存完全耗盡。更糟的是,泄漏的程序可能會用掉太多內存,導致另外一個程序垮掉,而使用戶無從查找問題的真正根源。此外,即使無害的內存泄漏也可能殃及池魚。
幸運的是,Visual Studio 調試器和 C 運行時 (CRT) 庫為我們提供了檢測和識別內存泄漏的有效方法。下面請和我一起分享收獲——如何使用 CRT 調試功能來檢測內存泄漏?

3. 編譯器在編譯階段,究竟做哪些事情

1. 預處理首先源代碼文件(.c/.cpp)和相關頭文件(.h/.hpp)被預處理器cpp預編譯成.i文件(C++為.ii)。預處理命令為:gcc –E hello.c –o hello.i預編譯過程主要處理那些源代碼中以#開始的預編譯指令,主要處理規則如下:u 將所有的#define刪除,並且展開所有的宏定義;u 處理所有條件編譯指令,如#if,#ifdef等;u 處理#include預編譯指令,將被包含的文件插入到該預編譯指令的位置。該過程遞歸進行,及被包含的文件可能還包含其他文件。u 刪除所有的注釋//和 /**/;u 添加行號和文件標識,如#2 「hello.c」 2,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生編譯錯誤或警告時能夠顯示行號信息;u 保留所有的#pragma編譯器指令,因為編譯器須要使用它們。2. 編譯編譯過程就是把預處理完的文件進行一系列詞法分析,語法分析,語義分析及優化後生成相應的匯編代碼文件(.s)。編譯的命令為:gcc –S hello.i –o hello.s或者從源文件直接輸出匯編代碼文件:gcc –S hello.c –o hello.s現在版本的GCC把預編譯和編譯兩個步驟合並成一個步驟,由程序cc1來完成(C++為cc1plus)。3. 匯編匯編就是將匯編代碼轉變成機器可以執行的命令,生成目標文件(.o),匯編器as根據匯編指令和機器指令的對照表一一翻譯即可完成。匯編的命令為:gcc –c hello.s –o hello.o或者從源文件直接輸出目標文件:gcc –c hello.c –o hello.o4. 鏈接鏈接就是鏈接器ld將各個目標文件組裝在一起,解決符號依賴,庫依賴關系,並生成可執行文件。鏈接的命令為:ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o一般我們使用一條命令就可以完成上述4個步驟:gcc hello.c實際上gcc只是一些其它程序的包裝,它會根據不同參數去調用預編譯編譯程序cc1、匯編器as、鏈接器ld。

4. 如何解決在交叉編譯的問題的crt0.o

如何添加ctr0.o?我得到這個錯誤:
yagarto-4.7.2/bin/arm-none-eabi-ld: cannot find crt0.o: No such file or directory
collect2: error: ld returned 1 exit status`
離這里很簡單的程序:
/* -- first.s */
/* This is a comment */
.global main /* 'main' is our entry point and must be global */
.func main /* 'main' is a function */
main: /* This is main */
mov r0, #2 /* Put a 2 inside the register r0 */
bx lr /* Return from main */
我看這2個線程,並沒有得到任何完整的和直截了當的回答: 什麼是從背後取下gcc4.7.x的crt0.o的理由? 我有這些文件,什麼是CRT0和外箱之間的區別不就可以了?
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtn.o
在SO解決方案給周圍的工作不工作了:
arm-none-eabi-gcc -o first assembler_tutorial/chapter01/first.o -nostartfiles
./yagarto-4.7.2/bin/arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000

本文地址 :CodeGo.net/603832/
-------------------------------------------------------------------------------------------------------------------------
1. vectors.s
.globl _start
_start:
mov sp,#0x8000
bl main
hang: b hang
main.s
.globl main
main:
mov r0,#2
bx lr
MEMMAP(鏈接腳本)
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x10000
}
SECTIONS
{
.text : { *(.text*) } > ram
.bss : { *(.bss*) } > ram
}
命令
arm-none-eabi-as vectors.s -o vectors.o
arm-none-eabi-as main.s -o main.o
arm-none-eabi-ld vectors.o main.o -T memmap -o main.elf
arm-none-eabi-objmp -D main.elf > main.list
arm-none-eabi-obj main.elf -O binary main.bin
結果
main.elf: file format elf32-littlearm

Disassembly of section .text:
00008000 <_start>:
8000: e3a0d902 mov sp, #32768 ; 0x8000
8004: eb000000 bl 800c <main>
00008008 <hang>:
8008: eafffffe b 8008 <hang>
0000800c <main>:
800c: e3a00002 mov r0, #2
8010: e12fff1e bx lr
如果你想,而不是ASM主C,則 main.c中
int main ( void )
{
return(2);
}
命令
arm-none-eabi-as vectors.s -o vectors.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c main.c -o main.o
arm-none-eabi-ld vectors.o main.o -T memmap -o main.elf
arm-none-eabi-objmp -D main.elf > main.list
arm-none-eabi-obj main.elf -O binary main.bin
結果
main.elf: file format elf32-littlearm

Disassembly of section .text:
00008000 <_start>:
8000: e3a0d902 mov sp, #32768 ; 0x8000
8004: eb000000 bl 800c <main>
00008008 <hang>:
8008: eafffffe b 8008 <hang>
0000800c <main>:
800c: e3a00002 mov r0, #2
8010: e12fff1e bx lr
我更喜歡其他的函數不是主要的編譯器添加額外的行李,當他們看到那個函數 vectors.s
.globl _start
_start:
mov sp,#0x8000
bl notmain
hang: b hang
main.c中
int notmain ( void )
{
return(2);
}
結果
main.elf: file format elf32-littlearm

Disassembly of section .text:
00008000 <_start>:
8000: e3a0d902 mov sp, #32768 ; 0x8000
8004: eb000000 bl 800c <notmain>
00008008 <hang>:
8008: eafffffe b 8008 <hang>
0000800c <notmain>:
800c: e3a00002 mov r0, #2
8010: e12fff1e bx lr

5. CRT怎麼新建怎麼tab

1)打開SecureCRT軟體,選項---全局選項---常規---默認的會話設置---編輯默認的設置---連接----右側的協議選擇為Telnet ;
2)在左側,選擇telnet,在右側的高級框里「強制每次一個字元模式」勾上,確定;
3)一直點擊「確定」,最後重啟SecureCRT軟體就可以了在secure crt菜單中 幫助 - 幫助主題 里
ActiveX Scripts 章節里
有關於secure crt所有內置對象的說明。

https://www.vandyke.com/support/securecrt/scripting_examples.html
這個鏈接中有一些例子腳本,例子腳本中vbs的比較多,js的比較少,
可能是比較傾向於用js吧。

通過腳本切換tab
還可以獲取不同的tab,在同的tab中執行不同的命令,在application對象
中可以做到。
如下例子:

Sub main
Set obj1 = crt.GetTab(1)
MsgBox "tab is " & obj1.index
Set ScreenObj1 = obj1.Screen
ScreenObj1.Send "your cmd"

Set obj2 = crt.GetTab(2)
MsgBox "tab is " & obj2.index
Set ScreenObj2 = obj2.Screen
ScreenObj2.Send "your cmd"
Sub main
1
2
3
4
5
6
7
8
9
10
11
解讀:crt.GetTab(1) 就是你在secure CRT中打開的第一個標簽。參數是2的就是第二個標簽。
例如
第一個標簽中打開的是編譯伺服器,在編譯伺服器中編譯,並把bin文件放在ftp伺服器上。
在第二個標簽中打開設備的串口,設備串口執行download命令,把ftp伺服器上的bin文件載入到設備中,並重啟設備。

幫助工作的實例
在實際的嵌入式開發實際中會遇到下邊的情況:

linux伺服器上編譯代碼
將編譯出的bin load到本地的tftp server的root目錄下
在設備上通過命令把bin在load到設備中
重啟設備
調試設備非常的頻繁,每次都手動做上面的所有步驟太過麻煩,用secure crt的腳本,一個腳本就可以完成。

通過豐富上邊腳本,在send中輸入所需的命令,即可實現。
實現過程略。

6. securecrt 怎樣調用notepad 編譯代碼

在使用這個插件前,請先在cmd里實驗,確保javac和java命令都能正常編譯和執行。

7. 怎樣在securecrt 上編譯

SecureCRT是一款支持SSH(SSH1和SSH2)的終端模擬程序,簡單地說是Windows下登錄UNIX或Linux伺服器主機的軟體。 SecureCRT支持SSH,同時支持Telnet和rlogin協議。 SecureCRT是一款用於連接運行包括Windows、UNIX和VMS的理想工具。 通過使用內含的VCP命令行程序可以進行加密文件的傳輸。 有流行CRTTelnet客戶機的所有特點,包括:自動注冊、對不同主機保持不同的特性、列印功能、顏色設置、可變屏幕尺寸、用戶定義的鍵點陣圖和優良的VT100,VT102,VT220和ANSI競爭。能從命令行中運行或從瀏覽器中運行。

8. SecureCRT常用命令

cd

編譯 cd ~/A40I_cunstom_android4.4
接著編譯cd ~/A40I_cunstom_android4.4 android
pwd

編譯 ls
4 .
編譯 ls -l

編譯 source build/envsetup.sh

編譯 lunch

編譯 41

編譯
13

編譯 extract-bsp

編譯 make -j8 && pack
直到編譯完成
光碟映像
pack 編譯 t3-lycoo-1440x900-T365-NewF40-H1-NewLauncher
如果更換 pack -b t3-lichao-YD60W-MYT-DSP-IKTV-T365

1編譯生成的類
cd out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/
2獲取TimeManager
find ./ -name TimeManager.class
3/打包成jar包
jar cvf TimaManager.jar ./android/app/TimeManager.class

cp 拷貝
mv 移動
rm 刪除 rm t3-lycoo -rf
chmod 修改許可權
chown 修改用戶名用戶組

固件查找log日誌:
1.//連接平板或手機ip
adb connect 192.168.1.61

adb remount

adb shell

/ # logcat

9. 如何在windows下編譯linux的開源程序

我聽都沒聽說過可以這樣做,首先,Windows不支持Linux的文件系統,如EXT3,EXT4,XFS之類的,其次,雖然有MinGW這樣的編譯工具,但無法用這些工具構建一個可以讀取和寫入上述文件系統的chroot工具包環境,因為在編譯Linux過程中,需要多次使用chroot。

閱讀全文

與crt編譯過程相關的資料

熱點內容
如何設置異地伺服器 瀏覽:882
為什麼安卓手機藍牙耳機不會彈窗 瀏覽:546
linuxf77編譯器安裝教程 瀏覽:949
android本地錄音許可權 瀏覽:446
加密u盤內容怎麼拷貝 瀏覽:283
安卓手機為什麼看不到iso文件 瀏覽:582
用圖片做文件夾圖標 瀏覽:693
java正則表達式語法 瀏覽:865
美圖秀在線壓縮圖片 瀏覽:184
蘋果自帶控制app是什麼 瀏覽:907
孩子學編程怎麼樣 瀏覽:589
網路編程經典書籍 瀏覽:612
曲靖創建網站java程序員 瀏覽:690
256位加密中是什麼意思 瀏覽:97
php多維數組去重 瀏覽:308
做程序員這一行儲備人才怎麼看 瀏覽:461
參加密逃文 瀏覽:327
蘋果編程語言ios 瀏覽:763
求解病態系統常用的演算法 瀏覽:994
駕校用的app叫什麼 瀏覽:219