首页
学习
活动
专区
工具
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.4K20
  • 深入浅出GCC编译器

    更多信息可以查看man手册 nm只能用于目标文件可执行文件,对普通文件无效 ④ objcopy: 目标文件一部分或者全部内容拷贝另外一个目标文件,或者实现目标文件格式转换。...进行类型审查,语义分析审查类型并报告错误。...也就是,语义分析结合上下文推导出语句真正含义。 (3)汇编(Assemoly) 由汇编器完成,汇编代码转变成机器可执行二进制代码(机器码),并生成目标文件。...编译编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件符号,比如全局变量或者调用了某个库函数函数,那么这时候,在这个文件符号地址是没法确定,只能由链接器把所有的目标文件链接到一起才能确定最终地址...(8)-D 指定宏 我们前面准备好hello.c进行一点修改,把宏定义删除 编译运行 因为没有定义 PRINT ,所以 printf 语句不会执行,也就不会打印任何东西。

    30410

    我与C语言二周目邂逅vlog——8.编译和链接

    编译器在生成目标文件,有些符号(如外部函数)并没有具体地址信息,因此需要链接器来进行符号解析。 重定位:目标文件地址信息进行调整,使得最终可执行文件所有地址都指向正确位置。...静态库会在链接被拷贝可执行文件,而动态库则是在程序运行时动态加载。 6.3 链接类型 静态链接:在静态链接,链接器所有目标文件和所需库函数全部复制最终可执行文件。...例如: 未定义引用:目标文件引用了一个未定义符号,例如函数声明找不到对应实现。 重复定义:多个目标文件存在相同全局变量或函数实现,导致符号冲突。...链接器详细工作机制 9.1 符号解析与重定位表 在链接阶段,链接器需要解决符号定义引用之间关系。符号是程序函数、变量等名字,它们在编译阶段可能并没有具体内存地址。...9.2 静态链接库与动态链接库 静态链接库(.a 文件):静态链接库在链接嵌入可执行文件,生成可执行文件独立性强,但体积较大。

    10710

    开篇:预备知识---2

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

    76920

    【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.3K30

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

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

    12310

    C++ gcc编译过程

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

    5.2K10

    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

    21020

    认识目标文件符号

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

    1.5K40

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

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

    3.3K52

    程序员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来保存源文件列表,引用变量则使用${}包裹.

    3.1K30

    深入浅出链接库 | 静态库与动态库

    链接库就是指文件编译后打包为一个二进制文件,这些二进制文件会在程序调用时候加载到内存。实际上,一个或多个源文件编译为目标文件后,这个文件中所引用外部符号需要通过链接来找到这部分缺失地址。...GCC 编译器在生成可执行文件,默认会优先使用动态链接库完成链接,如果当前系统环境没有程序文件所需要动态链接库,GCC 便会选择静态链接库进行静态链接。如果两种库文件没有找到,则链接失败。...也就是,头文件定义了调用库文件功能模块接口。头文件存在也实现了这样一种功能,当我们对外提供功能,可以通过库文件来隐藏源码实现,功能使用方只需要根据头文件所提供接口来调用功能模块即可。...但是,如果想链接位于其它目录库,比如我们自己建库,或者我们要引用别人提供库,就需要在编译显示指定库路径。.../header/ ② .o 文件打包 这里要用到 GCC -shared 选项,该选项指定生成动态连接库(让连接器生成T类型导出符号表,有时候也生成弱连接W类型导出符号),如果不用该标志的话外部程序无法连接

    33210

    gcc编译过程

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

    26210

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

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

    9810

    Go 静态编译及在构建 docker 镜像应用

    Go 语言具有跨平台和可移植特点,同时还支持交叉编译,可以在一个系统上编译出运行在另一个系统上二进制可执行文件,这是因为 Go 在编译支持依赖文件与源代码一起编译链接到二进制文件,所以在实际运行时不再需要依赖运行环境库...第三种则是标准函数实现打包一个标准函数目标文件,例如 libx.o,开发者可以在编译自行指定使用哪个标准函数目标文件。...,而不是像静态库内容那样被复制和嵌入引用它们可执行文件。...引用了 addvec.o 定义 addvec 函数符号,所以复制 addvec.o 可执行文件。...因为程序不引用任何由 multvec.o 定义符号,所以链接器就不会复制这个模块可执行文件。链接器还会复制 libc.a printf.o 模块,以及许多 C 运行时系统其他模块。

    8310

    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:对于指定存档文件,在存档包含所有文件

    17.5K13

    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.7K20

    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.5K30
    领券