首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GCC (minGW -Windows10)报告说,当我尝试将二进制文件嵌入到可执行文件中时,没有引用.o文件中定义的符号

GCC是GNU Compiler Collection的缩写,是一套由GNU开发的编程语言编译器。它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。

minGW是Minimalist GNU for Windows的缩写,是一个在Windows平台上使用GCC进行编译的开发环境。它提供了一套GNU工具链,可以用于开发和编译Windows应用程序。

在Windows10上使用GCC和minGW进行开发时,如果尝试将二进制文件嵌入到可执行文件中,但没有引用.o文件中定义的符号,可能会导致报错。

.o文件是GCC编译源代码后生成的目标文件,其中包含了编译后的二进制代码和符号表等信息。当链接可执行文件时,链接器会根据.o文件中的符号表来解析和引用符号。

如果在链接过程中出现没有引用.o文件中定义的符号的报错,可能有以下几种原因:

  1. 缺少对应的.o文件:检查是否将所有需要的.o文件都包含在链接过程中。
  2. 符号命名冲突:检查是否存在符号命名冲突,可能是因为不同的.o文件中定义了相同的符号。
  3. 编译选项错误:检查编译选项是否正确设置,例如是否启用了优化选项或链接选项。

解决这个问题的方法包括:

  1. 确保所有需要的.o文件都包含在链接过程中。
  2. 检查并解决符号命名冲突。
  3. 检查并正确设置编译选项。

对于GCC和minGW的具体使用和更多信息,可以参考腾讯云提供的GCC编译器相关文档和产品介绍:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

程序员C语言快速上手——工程篇(十二)

表示符号位于未初始化数据段(bss)。例如,在一个文件定义静态全局变量static int num 静态链接 链接主要有两方面工作 符号解析。符号解析目的是符号引用符号定义关联起来。...main.o如下,start符号地址也为0,这里main.o引用了另一个目标文件定义符号add,关于符号类型详见上表。 ?...动态链接并不能在编译进行,它只能在加载进行。因此,当我们编写好代码,并依赖动态库生成可执行文件是关联动态库,而不是链接动态库。...当链接器ldapp1.o链接成可执行文件, 这时链接器必须确定app1.o中所引用int_div函数性质。...如果int_div函数是一个定义在其他静态目标模块函数, 那么链接器将会按照静态链接规则, app1.oint_div地址重定位;如果int_div是一个定义在某个动态共享库函数, 那么链接器就会将这个符号引用标记为一个动态链接符号

1.3K20

arm-gcc各版本区别

然后他自己,开了一个网站,供人下载. http://www.leeos.org/ 我上午一直没有开电脑,也就没有没有看这个网站.书看了半本也晚上了,我就打开电脑准备写笔记.想起了这个网站,准备实操一波...从本质来讲他们都是编译器,而gcc是linux系统下面用来代码编译成一个可执行程序手段。编译出来是适用于linux系统可执行二进制文件。可执行程序其实就是一堆0101二进制机器码。...在计算机,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序低级接口。 EABI 嵌入式ABI。...嵌入式应用二进制接口指定了文件格式、数据类型、使用、堆积组织优化和在一个嵌入式软件参数标准约定。开发者使用自己汇编语言也可以使用 EABI 作为与兼容生成汇编语言接口。...也是可以 解释:gcc对.c文件默认进行预处理操作,-c选项编译汇编操作,汇编操作得到.o文件,通过gcc -o hello hello.o命令对hello.o文件进行链接,得到可执行文件

3.2K20

开篇:预备知识---2

可以看到,除了添加了部分注释之外,#include 指令 custom1.h 头文件文本内容复制 #include 指令所在位置了。那么当被包含文件还包含了其他头文件情况如何呢?...链接 ​ 我们已经通过上面的 汇编 步骤得到二进制文件了,为什么还不能执行呢?因为我们上面的不是真正可执行文件,其缺少一些必要系统入口代码和库实现文件。...这个问题相信很多小伙伴都遇见过,意为未定义指向 maxx 函数引用。即链接器找不到指向 maxx 函数实现。...上问提到:使用动态链接库文件并不是整个库文件链入可执行程序文件,而是在可执行文件存入动态链接库文件相关信息,以供程序在运行过程在需要进行动态链接库文件加载。...汇编过程汇编代码变成二进制文件,最后经过链接处理生成可执行文件

73920

【C++100问】CC++程序执行过程详解之预处理、编译、汇编、链接和执行,以及g++_gcc安装使用

图解如下: 1、✏ 预处理 预处理器: #include 包含文件内容插入该命令处,检查全文处理 #define 宏定义,处理条件编译命令 #if #endif 将不需要 code 屏蔽掉,处理完毕后生成修改后源代码...g++ -o test.ii -E test.cpp test.cpp 文件预处理成 test.ii 文件 2、✏ 汇编 汇编器:汇编源文件翻译成对应机器指令。...g++ -o test.o -c test.s 汇编输出文件 test.s 编译成 test.o 文件 4、✏ 链接 链接器:比如 test.o 里调用了标准库里函数 printf ,连接器工作就是找到...prinf 所在目标文件 xx.o 或是 xx.lib 然后将该程序插入到我们 test.o g++ -o test.exe test.o 编译输出文件 test.o 链接成最终可执行文件...( obj 文件)与你程序里面调用库函数对应代码连接起来形成对应可执行文件(exe 文件), 其他都需要在实践多多体会才能有更深理解。

1.1K30

【C语言】编译和链接深度剖析

经过预处理后.i文件不再包含宏定义,因为宏已经被展开。并且包含文件都被插入.i文件。所以当我们无法知道宏定义或者头文件是否包含正确时候,可以查看预处理后.i文件来确认。...所以这个gcc命令就是利用gcc作为汇编器,汇编源代码test.s翻译成目标对象文件test.o过程。它完成了汇编阶段主要工作—从汇编语言机器代码转换。...链接阶段读取对象文件 链接器读取所有对象文件,并构建一个全局符号表。 符号决议 链接器检查全局符号是否存在重复定义或未定义外部符号。如果有,报错;如果没有,继续下一步。...链接阶段,链接器读取test.o和add.o,构建全局符号表。 符号决议,检查全局符号表: Add函数和g_val变量在两个对象文件中都有定义没有重复定义错误。...main函数调用Add和引用g_val在test.o没有定义,标记为未定义外部符号

7910

C++ gcc编译过程

第四步:链接 链接器ld各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。 ==操作演示== 本文以两个简单代码文件为例。...生成预处理文件方式有三种。 1.使用cpp 命令执行预编译。输出内容转移到文件方式。此处 > 符号表示输出到文件。 执行命令后,查看目录文件信息。...1.使用编译指令 注意这里cc1是数字1.不是字母l.并且cc1位于minGw安装目录下 libexec\gcc\mingw32\4.8.1 目录下。并没有默认在bin目录下。需要注意配置。...如下 执行后查看目录文件信息如下图: 咱们这里主要讲述了使用MinGw编译C++程序整个过程。一共涉及4个过程,分别是预处理、编译、汇编、链接等四个过程。...链接主要由连接器二进制对象文件和相关其他静态、动态链接库打包生成操作系统可执行文件MinGw主要提供g++程序能够帮助我们完成整个过程。也可以在某些步骤进行单独操作。而且可以保留临时文件等。

5.1K10

Linux工具学习之【gccg++】

-o OK test.c //这种写法也是可以 在我们使用 gcc/g++ ,都可以通过 -o 选项生成指定文件 -E 预处理 在C语言学习阶段,我们学习了源文件变成可执行文件过程,即预处理...test.c 开始执行,也可以从上一步 test.i 执行 -c 汇编 接下来进入第三步:汇编 主要任务是汇编代码转为二进制,并生成符号二进制文件格式是 elf ,此时 vim 查看为乱码...生成文件后缀为 .o 因为计算机只能看懂二进制,所以代码转为二进制是必须进行操作,除此之外,还有一个重要步骤:生成符号表 关于符号表 这个东西相当于函数独一无二地址,在Linux ,C语言符号表比较简单...gcc 链接 下面是最后一步:链接 进行合并段表、符号表进行合并和重定位等 程序运行所需各种函数链接起来,包括与库函数链接,Linux 中一般是动态链接,链接后生成可执行文件,此时文件也是...elf 格式 gcc 默认生成可执行文件为 a.out,我们可以指定生成任意文件 $ gcc test.c -o myfile //生成可执行文件为 myfile $ gcc test.o -o

16520

认识目标文件符号

特殊符号 当我们使用 ld 作为链接器来链接生产可执行文件,它会为我们定义很多特殊符号,这些符号没有在你程序定义,但是你可以直接声明并且引用它,我们称之为特殊符号。...链接器会在程序最终链接成可执行文件时候将其解析成正确值,注意,只有使用 ld 链接生产最终可执行文件时候这些符号才会存在。几个很具有代表性特殊符号如下,其他特殊符号,在此不一一列举了。...目前我们所看到对外部目标文件符号引用在目标文件被最终链接成可执行文件,它们须要被正确决议,如果没有找到该符号定义,链接器就会报符号定义错误,这种被称为强引用(Strong Reference)...但是当我们运行这个可执行文件,会发生运行错误。因为当main函数试图调用foo函数,foo函数地址为0,于是发生了非法地址访问错误。...,从而使得程序可以使用自定义版本库函数;或者程序可以对某些扩展功能模块引用定义为弱引用当我扩展模块与程序链接在一起,功能模块就可以正常使用;如果我们去掉了某些功能模块,那么程序也可以正常链接

1.5K40

含大量图文解析及例程 | Linux下ELF文件、链接、加载与库(上)

包含二进制代码和数据,其形式可以再编译与其他可重定位目标文件合并起来,创建一个可执行目标文件。 可执行(executable)目标文件:是完全链接可执行文件,即静态链接可执行文件。...包含二进制代码和数据,其形式可以被直接复制内存并执行。 共享(shared)目标文件:通常是.so动态链接库文件或者动态链接生成可执行文件。...但这时,如果我们main.cfoo声明为一个整型,并且直接打印出这个整型,然后尝试对其加一。即我们main.c改写为下面这样,会发生什么事呢?...简单讲,就是当某个文件引用了外部符号,在编译编译器是不会阻止你这样做,因为它相信你会在链接告诉它这些外部符号是什么东西。...但在编译,它也不知这些符号具体在什么地址,因此这些符号地址会在编译被留空为0。此时重定位,就是链接器这些留空为0外部符号填上正确地址。

1.9K51

程序员C语言快速上手——工程篇(十三)

: div.c gcc -c div.c # 伪目标,删除所有.o文件 clean: rm *.o cd当前目录,执行输入make命令,即可快速编译生成main.exe程序,当我们需要清理整个工程...但是要注意,我们如果在Windows上执行以上简化版make,则会报错,这是因为在Linux系统,cc命令会默认链接到gcc命令上,执行cc命令就是在执行gcc命令,而我们Windows系统没有...,通常会定义clean、install这些伪目标,install一般定义拷贝命令,生成可执行程序拷贝应用安装目录下。...cmake -G "MinGW Makefiles" 要注意,以上命令直接在CMD命令行执行可能会报错,它需要一个sh环境,这里有两种解决办法 sh.exe所在目录加入环境变量,它位于MinGW...定义变量 源文件较多时,可以定义一个变量来保存,后续只需要引用该变量即可,如下,定义src_list来保存源文件列表,引用变量则使用${}包裹.

2.9K30

gcc编译过程

前言 GCC 仅仅是一个编译器,没有界面,必须在命令行模式下使用。通过 gcc 命令就可以文件编译成可执行文件。...得到二进制文件 -g 编译添加调试文件,用于 gdb 调试 -Wall 显示所有警告信息 -D 向程序“动态”注册宏定义 -l 指定动态库库名 -L 指定动态库路径 三、文件后缀名对应表 后缀名 类型...例如,某个源文件函数可能引用了另一个源文件定义某个符号(如变量或者函数调用等);在程序可能调用了某个库文件函数,等等。所有的这些问题,都需要经链接程序处理方能得以解决。...链接程序主要工作就是将有关目标文件彼此相连接,也即将在一个文件引用符号同该符号在另外一个文件定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行统一整体,也就是可执行程序。...动态链接缺点: (1)速度没有静态链接快; (2)不具有自完备,如果用户机器没有.dll文件,程序无法运行并且报错 动态链接编译: gcc hello.o -o hello

20210

【C语言基础】:编译和链接(计算机翻译官)

符号解析: 在汇编代码,可能会使用标签(labels)和符号(symbols)来引用内存位置或数据。汇编器这些符号解析为具体地址或值。...当一个目标文件引用了另一个目标文件符号,链接器会找到该符号定义,并在链接进行适当修改。...重定位是链接过程一个关键步骤,它涉及修改代码地址引用,确保它们指向正确内存位置。这是因为在编译,编译器并不知道最终内存布局。...这个文件包含了程序所有代码、数据、符号表、以及运行时所需其他信息。 可执行文件格式依赖于目标操作系统和平台。例如,在Windows上通常是.exe文件,在Linux上通常是没有扩展名文件。...处理链接错误(Link-Time Errors): 如果在链接过程中发现错误,如未定义符号、多重定义、或者不兼容库版本,链接器会报告这些错误。

6610

Linux命令(65)——ld命令

1.命令简介 ld命令是二进制工具集GNU Binutils一员,是GNU链接器,用于目标文件与库链接为可执行程序或库文件。...-b :指定目标代码输入文件格式 -Bstatic:只使用静态库 -Bdynamic:只使用动态库 -Bsymbolic:把引用捆绑共享库全局符号 -c <MRI-commandfile...当链接大型可执行文件,如果ld耗尽内存空间,则可能需要使用该选项 -O :对于非零优化等级,ld优化输出。此操作会比较耗时,应该在生成最终结果使用。...org>:使用指定地址作为bss段起始点 -t,--trace:在处理输入文件显示它们名称 -u ,--undefined=:强制指定符号在输出文件作为未定义符号...warn-once:对于每个未定义符号只发出一次警告 -warn-section-align:如果为了对齐而改动了输出段地址,则发出警告 --whole-archive:对于指定存档文件,在存档包含所有文件

16.9K01

CC++生态工具链——gccg++编译器使用指南

三,常见代码文件后缀名 (1)目标文件: xxx.o, 操作系统:Linux, Mac xxx.obj, 操作系统:windows (2)二进制文件: xxx(没有后缀名), 操作系统:Linux,...2.编译 首先检查代码规范性和语法错误等,检查完毕后把代码翻译成汇编语言,生成汇编语言文件 3.汇编 基于汇编语言文件生成二进制格式目标文件 3.链接 目标代码与所依赖文件进行关联或者组装,合成一个可执行文件...此时只进行编译生成汇编代码,而不对代码以汇编方式调试 g++ -S demo.i -o demo.s 3.汇编--xx.s文件汇编成xx.o二进制目标文件 g++ -c demo.s -o demo.o...目标程序与静态库链接,目标程序代码调用任何外部函数代码都会从静态库复制最终可执行文件。...-O1 / -O #尝试优化编译时间和可执行文件大小 -O2 #尝试所有的优化选项,但不会进行“空间换时间”优化方式 -Os #尝试所有的优化选项,优先优化可执行文件大小 七,参考阅读 https

2.1K30

深入理解编译、链接和运行(obj文件组成格式分析,可执行文件组成格式分析)

那么我们用高级语言编写程序最终是怎么成为计算机可以识别的机器语言。在linux系统上,当我们输入./a.out并进行回车发生了什么。作为一名程序员,这是我们需要知道。...: 编译 整个编译过程分为预编译、编译和汇编,最终生成可执行文件,其中在windows下生成 .obj文件,在linux下生成 .o文件,学名叫做二进制可重定位文件 (1)预编译:gcc...(2)编译:gcc -S *.i -o *.s 词法分析、语法分析和语义分析、代码优化、编译、汇总所有的所有的符号 (3)汇编:gcc -c *.s -o *.o 汇编指令转换为特定平台下机器语言...sum.o所生成符号表: 符号解析:所有obj文件符号符号引用地方都要找到符号定义地方,否则就会出现链接错误。...合理分配策略:所有属性相同段合并,组织在一个页面上。合并所有.obj文件段,调整段大小和段偏移,重点:合并符号表,进行符号解析,即符号重定位,即在符号引用地方找到符号定义地方。

1.5K30

Linux嵌入式开发——C编程

具体操作如下所示: -c:只编译不链接为可执行文件,编译器输入.c 文件编译为.o 目标文件。...当我们直接输入gcc xxx时候,会默认生成一个a.out可执行文件,如下所示: gcc main.c 每一个文件都叫a.out也不是办法,我们为了美观,就指定一个我们想要名字,但是需要使用-o...make:一般GNU Make,是一个命令工具,是一个解释 makefile 中指令命令 工具,用于源代码文件编译为可执行二进制文件,make工具主要用于完成自动化编译。...make 运行结果如下所示: gcc -c main.c gcc -c input.c gcc -c calcu.c gcc -o main main.o input.o calcu.o 当我们修改其中一个文件...然后输入clear指令,就会发现我们需要清除文件也清除了。 mclear 运行结果: rm *.o rm main ` 当我们修改其中一个文件,看一下再次执行会产生什么样后果。

4.6K20

嵌入式Linux驱动开发——汇编点灯

str r1, [r0]: 这一行寄存器 r1 值写入地址为 r0 内存位置,即将生成掩码写入GPIO1时钟寄存器,从而启用GPIO1钟。...、链接、转换为二进制文件,并生成反汇编文件,具体作用如下: arm-linux-gnueabihf-gcc -g -c led.s -o led.o: arm-linux-gnueabihf-gcc...-O binary:指定目标文件格式为二进制。 -S:去除调试符号和调试信息。 -g:保留全局符号信息。 led.elf:输入可执行文件名,即刚刚生成可执行文件。...led.elf:输入可执行文件名,即刚刚生成可执行文件。 > led.dis:反汇编结果输出到led.dis文件,这里是生成反汇编文件。...arm-linux-gnueabihf-gcc -g -c led.s -o led.o:编译led.s文件为目标文件led.o,这里使用了arm-linux-gnueabihf工具链gcc编译器,

11510

程序生成之编译、链接、加载浅析

(1) 预处理过程 预处理过程.c文件转换为.i文件,当编译器为gcc,使用命令是gcc -E,对应于预处理命名cpp。...该指令文件定义统统都加入它所产生输出文件,以供编译程序对之进行处理。 特殊符号 预编译程序可以识别一些特殊符号。...相对于静态函数库,动态函数库在编译时候并没有被编译进目标代码,只有程序执行相关函数,才调用该动态函数库里相应函数,因此,动态函数库产生可执行文件较小。...链接器函数代码从其所在地(目标文件或静态链接库)拷贝最终可执行程序。这样该程序在被执行时这些代码将被装入该进程虚拟地址空间中。...为了创建可执行文件,链接器必须完成任务是: 符号解析:把目标文件符号定义引用联系起来; 重定位:把符号定义和内存地址对应起来,然后修改所有对符号引用

1.1K60

Linux 程序编译过程详解

C标准库定义了一组标准头文件,每个头文件包含一些相关函数、变量、类型声明和宏定义,譬如常见printf函数便是一个C标准库函数,其原型定义在stdio头文件。...使用gcc进行汇编命令如下: $ gcc -c hello.s -o hello.o // 编译生成hello.s文件汇编生成目标文件hello.o // GCC选项-c使GCC在执行完汇编后停止...链接器函数代码从其所在地(不同目标文件或静态链接库)拷贝最终可执行程序。...为创建可执行文件,链接器必须要完成主要任务是:符号解析(把目标文件符号定义引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号引用)。...在Linux系统,执行二进制文件动态库搜索路径顺序通常为:首先搜索编译目标代码指定动态库搜索路径;再从环境变量LD_LIBRARY_PATH指定路径寻址;再从配置文件/etc/ld.so.conf

1.7K30
领券