导航:首页 > 源码编译 > 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编译过程相关的资料

热点内容
问道端游下载了忘了在哪个文件夹 浏览:251
开源phpoa框架 浏览:293
惠普511类似文件夹图标闪动 浏览:53
php通讯录系统 浏览:73
javajar包maven 浏览:108
仿图怪兽安卓源码 浏览:977
程序员越来越困 浏览:865
女朋友java程序员 浏览:338
魔兽世界加密货币 浏览:783
程序员打卡日记 浏览:766
车间压缩空气有水怎么处理 浏览:835
java类调用php 浏览:476
php时间控制 浏览:808
用流程图表示算法分类 浏览:931
本地git文件夹误删除怎么恢复 浏览:748
java快速开发平台开源 浏览:996
java实战从入门 浏览:155
javahello程序 浏览:13
java系统输出 浏览:934
430单片机存储 浏览:396