关于“或上一个增量链接没有生成它;正在执行完全链接”

今天在编译一个程序的时候,总是出现“或上一个增量链接没有生成它;正在执行完全链接”这样的错误,到Debug目录中始终找不到生成的程序,但是在VS2008中调试执行的时候还能通过,百思不得其解。到网上查了半天也没有一个人清晰的解答出来,而且很多人都是说了一半就不说了。感觉起来应该是一个比较容易解决的问题,我想我可能犯了一个比较初级的错误,没办法,既然网上没有明晰的答案,只好自己找。结果还真的比较简单的找到了问题出处,还真是一个幼稚的错误。

    如果发生这样的错误,提示如下:

1>LINK : 没有找到 D:\cplus\hgetest2\Debug\hgetest2.exe 或上一个增量链接没有生成它;正在执行完全链接

1>正在嵌入清单...

1>生成日志保存在“file://d:\cplus\hgetest2\hgetest2\Debug\BuildLog.htm”

1>hgetest2 - 0 个错误,0 个警告

========== 全部重新生成: 1 已成功, 0 已失败, 0 已跳过 ==========

注意下面的提示,它说已经成功生成,但是没有在程序Debug目录下,而是在当前工程的根目录下有一个Debug目录,你生成的程序就在那里放着呢。一个简单的问题,但是我到网上查了好多,始终没有一个人能明确的说出来。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
内容简介 《链接器和加载器》讲述构建程序的关键工具——链接器和加载器,内容包括链接和加载、体系结构、目标文件、存储分配、符号管理、库、重定位、加载和覆盖、共享库、动态链接和加载、动态链接的共享库,以及着眼于成熟的现代链接器所做的一些变化;并介绍一个持续的实践项目,即使用Perl语言开发一个可用的小链接器。 《链接器和加载器》适合高校计算机相关专业的学生、实习程序员、语言设计者和开发人员阅读参考。 编辑推荐 《链接器和加载器》:不管你的编程语言是什么,不管你的平台是什么,你很可能总是会涉及链接器和加载器的功能。但是你知道如何最大限度地利用它们吗?只有现在,随着《链接器和加载器》的出版,总算有一本深入完整地彻底揭示编译时和运行时过程的权威著作了。 《链接器和加载器》首先通过实例深入浅出地阐述了在不同的编译器和操作系统中链接和加载过程的差异。在这个基础上,作者提出了清晰实用的忠告,来帮助你创建更快、更清晰的代码。你将会学习如何规避和Windows DLL相关的陷阱,充分利用UNIX ELF库模式等。如果你对程序设计抱有非常认真的态度,那么你可以通过这本书充分地理解这个领域内最难懂的主题之一。《链接器和加载器》对于编译器和操作系统课程同样也是一本理想的补充读物。 《链接器和加载器》特性 ◆覆盖了Windows,UNIX,Linux,BeOS和其它操作系统的动态链接过程。 ◆解释了Java链接模式,以及它是如何应用在网络小应用程序和可扩展Java代码中的。 ◆帮助你编写更优雅、更高效的代码,以及构建能够被更加高效地编译、加裁和运行的应用程序。 ◆包含了一个用Perl构建链接器的练习项目,项目文件可以从网络下载得到。 媒体推荐 “我很享受阅读这本对实现链接器和加载器的众多技术和挑战进行有效概述的书。虽然书中的多数例子都集中在今天被广泛使用的三种计算机体系结构上,但这本书也包含了很多描述过去的一些有趣和古怪的计算机体系结构的注解。通过这些真实的战例,我断定作者本人真正经历了这些事情并存活了下来给我们讲述这个故事。” ——Guy Steele 作者简介 作者:(美国)莱文(John R.Levine) 译者:李勇 莱文(John R.Levine),是很多书籍的作者或合作者,包括Lex & Yacc(O'Reilly),Programming for Graphics Files in C and C++(Wiley),以及7-heIntemetforDummies(IDG)。他还是Journal of C Language Translation的荣誉退休发行人、comp.compilers新闻组的长期仲裁人员,以及某个最早的商用Fortran 77编译器的创建考。他在耶鲁大学获得了计算机科学的博士学位。 目录 第1章 链接和加载 1.1 链接器和加载器做什么? 1.2 地址绑定:从历史的角度 1.3 链接与加载 1.4 编译器驱动 1.5 链接一个真实的例子 练习 第2章 体系结构的问题 2.1 应用程序二进制接口 2.2 内存地址 2.3 地址构成 2.4 指令格式 2.5 过程调用和寻址能力 2.6 数据和指令引用 2.7 分页和虚拟内存 2.8 Intel 386分段 2.9 嵌入式体系结构 练习 第3章 目标文件 3.1 目标文件中都有什么? 3.2 空目标文件格式:MS-DOS的COM文件 3.3 代码区段:UNIX的a.out文件 3.4 重定位:MS-DOS的EXE文件 3.5 符号和重定位 3.6 可重定位的a.out格式 3.7 UNIX的ELF格式 3.8 IBM 360目标格式 3.9 微软可移植、可执行体格式 3.10 Intel/Microsoft的OMF文件格式 3.11 不同目标格式的比较 练习 项目 第4章 存储空间分配 4.1 段和地址 4.2 简单的存储布局 4.3 多种段类型 4.4 段与页面的对齐 4.5 公共块和其他特殊段 4.6 链接器控制脚本 4.7 实际中的存储分配 练习 项目 第5章 符号管理 5.1 绑定和名字解析 5.2 符号表格式 5.3 名称修改 5.4 弱外部符号和其他类型符号 5.5 维护调试信息 练习 项目 第6章 库 6.1 库的目的 6.2 库的格式 6.3 建立库文件 6.4 搜索库文件 6.5 性能问题 6.6 弱外部符号 练习 项目 第7章 重定位 7.1 硬件和软件重定位 7.2 链接时重定位和加载时重定位 7.3 符号和段重定位 7.4 基本的重定位技术 7.5 可重链接和重定位的输出格式 7.6 其他重定位格式 7.7 特殊情况的重定位 练习 项目 第8章 加载和覆盖 8.1 基本加载 8.2 带重定位的基本加载 8.3 位置无关代码 8.4 自举加载 8.5 树状结构的覆盖 练习 项目 第9章 共享库 9.1 绑定时间 9.2 实际的共享库 9.3 地址空间管理 9.4 共享库的结构 9.5 创建共享库 9.6 使用共享库链接 9.7 使用共享库运行 9.8 malloc hack和其他共享库问题 练习 项目 第10章 动态链接和加载 10.1 ELF动态链接 10.2 ELF文件内容 10.3 加载一个动态链接程序 10.4 使用PLT的惰性过程链接 10.5 动态链接的其他特性 10.6 运行时的动态链接 10.7 微软动态链接库 10.8 OSF/1伪静态共享库 10.9 让共享库快一些 10.10 几种动态链接方法的比较 练习 项目 第11章 高级技术 11.1 C++的技术 11.2 增量链接和重新链接 11.3 链接时的垃圾收集 11.4 链接时优化 11.5 链接时代码生成 11.6 Java链接模型 练习 项目 参考文献 序言 几乎从有计算机以来,链接器和加栽器就是软件开发工具包中的一部分,因为它们允许使用模块(而不是一个单独的大文件)来构建程序的关键工具。 早在1947年,程序员们就开始使用原始的加载器:将程序的例程存储在多个不同的磁带上,并将它们合并、重定位为一个程序。在20世纪60年代早期,这些加栽器就已经发展得相当完善了。由于那时内存很贵且容量有限,计算机的速度很慢(以今天的标准),为了创建复杂的内存覆盖策略(以将大容量的程序加载到小容量内存中),以及重新编辑先前链接过的文件(以节省重新创建程序的时间),这些链接器都包含了很多复杂的特性。 20世纪七八十年代,链接技术几乎没有什么进展。链接器趋向于更加简单,虚拟内存技术将应用程序和覆盖机制中的大多数存储管理工作都转移给了操作系统,越来越快的计算机和越来越大的磁盘也使得重新链接一个程序或替换个别模块比仅仅链接改变过的地方更加容易了。从20世纪90年代起,链接器又开始变得复杂起来,增加了诸多现代特性,包括对动态链接共享库的支持和对C++独特要求的支持。同时,像IA64那样具有宽指令字和编译时访存调度特性的先进处理器架构,也需要将一些新的特性加入到链接器中,以确保在被链接的程序中可以满足代码的这些复杂需求。
简单性 Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持goto语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 Java是一个面向对象的语言。对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。 Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。例如,Java提供产生图形用户接口部件的类(java.awt包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(java.io包)和支持网络功能的类(java.net包)。 分布性 Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。 在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。 稳健性 Java原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成写高可靠和稳健软件的。Java消除了某些编程错误,使得用它写可靠软件相当容易。 Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。 可靠性方面最重要的增强之一是Java的存储模型。Java不支持指针,它消除重写存储和讹误数据的可能性。类似地,Java自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。 异常处理是Java中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。使用try/catch/finally语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。
### 回答1: Buildroot是一个开源工具,可以自动化地构建嵌入式Linux系统。它可以帮助用户从源代码自动构建所需的库、内核、文件系统和应用程序等组件,实现定制化的嵌入式Linux系统。 下面是Buildroot自动化能力的四个例子: 1. 交叉编译:Buildroot可以自动化地交叉编译嵌入式Linux系统所需的组件,无需手动配置交叉编译环境和编译选项。 2. 压缩文件系统:Buildroot可以自动化地压缩文件系统,使其适用于嵌入式系统的存储空间有限的情况。用户只需设置所需的文件系统类型和压缩算法即可。 3. 自动化构建内核:Buildroot可以自动化地下载、配置和构建内核,用户只需设置所需的内核版本和配置选项即可。 4. 生成完整镜像:Buildroot可以自动化地生成完整的镜像文件,包括内核、文件系统和引导程序等组件。用户只需设置所需的镜像格式和引导程序即可。 而Busybox则是一个类Unix操作系统的精简版工具集,包含了大量常用的命令和工具。虽然Busybox可以通过Makefile进行自动化编译,但在使用时还需要手动进行一些操作,下面是Busybox需要手动操作的四个例子: 1. 选择需要的工具:Busybox包含了大量的命令和工具,用户需要手动选择需要的工具进行编译,否则会增加不必要的存储空间。 2. 编译选项设置:用户需要手动设置编译选项,以便根据实际需求进行优化和配置。 3. 环境变量设置:为了方便使用Busybox中的工具,用户需要手动设置环境变量,以使其在系统中可用。 4. 手动配置系统:由于Busybox只是一个工具集,用户需要手动配置系统的其他组件,如内核、文件系统和应用程序等,以构建完整的嵌入式Linux系统。 ### 回答2: Buildroot 是一个用于构建嵌入式 Linux 系统的工具集。它可以自动化完成如下的任务: 1. 交叉编译:Buildroot 可以根据用户的配置,选择合适的交叉编译工具链,自动下载和安装所需的工具链,并将用户选择的软件包交叉编译为嵌入式系统可执行的二进制文件。 2. 系统镜像生成:Buildroot 可以自动构建整个嵌入式 Linux 系统的根文件系统镜像,包括文件目录结构、设备节点、库文件和可执行文件等,并支持添加自定义的初始化脚本。 3. 映像更新:当用户对配置进行更改后,Buildroot 可以智能地识别这些更改,并仅重新编译受影响的软件包和相关组件,以提高构建效率。通过增量更新技术,可以快速生成只包含最新更改的新系统镜像。 4. 包管理:Buildroot 提供了一个包管理系统,可以方便地添加、删除和更新软件包。用户只需在配置文件中指定需要安装的软件包和依赖关系,Buildroot 就会自动下载、编译和安装所需的软件包及其依赖。 相比之下,BusyBox 是一个集成了许多常用 Unix 工具的软件包,它可以在嵌入式系统上提供许多核心命令和功能。BusyBox 需要手动完成如下的一些任务: 1. 配置定制:BusyBox 需要通过手动配置文件来选择所需的工具和功能。用户需要清楚地了解系统的需要,并手动选择和配置适合的工具,以便生成适合自己需求的版本。 2. 编译构建:用户需要手动使用交叉编译工具链来编译 BusyBox,并将生成的可执行文件手动安装到目标嵌入式系统中。 3. 命令管理:BusyBox 需要用户手动管理各个命令的使用方式和参数,通过命令行输入不同的命令和选项来执行具体功能。 4. 功能扩展:如果用户需要额外的功能或新的命令,需要手动编写扩展模块,并将其集成到 BusyBox 中,以便生成自定义的 BusyBox。 总之,Buildroot 提供了自动化构建嵌入式 Linux 系统的功能,而 BusyBox 则需要用户手动选择和配置工具、手动编译安装,并需要手动管理命令和功能。 ### 回答3: Buildroot是一个用于嵌入式Linux系统构建的工具,它可以自动化完成以下任务: 1. 系统交叉编译:Buildroot可以自动进行系统交叉编译,生成适用于目标硬件平台的二进制可执行文件、库文件和内核镜像等。它会根据用户的配置选择适合目标平台的编译和链接工具链,并自动完成编译过程。 2. 软件包管理:Buildroot拥有一个丰富的软件包库,用户可以通过配置文件选择需要的软件包,Buildroot会自动下载、编译和安装这些软件包。用户只需要在配置文件中指定需要的软件包名称和版本,Buildroot会自动处理依赖关系,并生成镜像文件。 3. 文件系统生成:Buildroot可以自动根据用户的需求生成根文件系统,包括设备文件、配置文件、库文件和可执行文件等。用户只需要选择需要的文件和目录,Buildroot会自动将它们打包为文件系统,并生成相应的映像文件。 4. 重复构建管理:Buildroot能够自动检测和管理当前系统的构建状态。它利用缓存机制,只在必要的时候重新构建软件包和文件系统,以提高构建效率。当用户修改配置文件或软件包源码时,Buildroot会自动重新构建相关部分,而无需重新构建整个系统。 Busybox是一个集成了多个常用工具的软件包,需要用户手动配置和编译才能生成对应的可执行文件,常见的手动操作如下: 1. 配置:用户需要手动选择需要集成的工具,并根据自己的需求进行相关配置。这些工具包括文件操作、网络管理、系统管理、终端操作等。用户需要根据具体情况选择需要的功能,通过修改配置文件或使用命令行参数来完成配置。 2. 编译:用户需要手动使用交叉编译工具链对Busybox进行编译,生成执行文件。编译过程中,用户可以根据需要选择编译生成的目标文件类型、优化等级等参数。 3. 安装:编译完成后,用户需要手动将生成的可执行文件安装到目标系统中的指定位置。这涉及到文件拷贝、权限设置等操作。 4. 调试和维护:当用户需要进行调试和修改时,需要手动重新进行配置、编译和安装。这需要用户具备一定的Linux系统和编译工具的使用经验,并需要耗费时间和精力进行相关的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值