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

为什么C/C++ 'obj‘文件只对特定的编译器有效?

C/C++的'obj'文件是编译器生成的中间文件,包含了源代码编译后的机器代码和符号表等信息。它的有效性与特定的编译器相关,主要有以下几个原因:

  1. 机器代码格式:不同的编译器可能使用不同的机器代码格式,例如x86、ARM等。因此,生成的'obj'文件中的机器代码也会有所不同,只有与特定编译器兼容的机器代码才能被正确地链接和执行。
  2. 符号表和调试信息:'obj'文件中包含了源代码中定义的变量、函数等符号的信息,以及用于调试的相关信息。这些信息的格式和存储方式可能因编译器而异,因此只有相同编译器生成的'obj'文件才能正确地解析和使用这些信息。
  3. 编译器优化和特性:不同的编译器可能具有不同的优化策略和特性,例如内联函数、代码重排等。这些优化和特性会影响生成的机器代码的结构和执行方式,因此只有相同编译器生成的'obj'文件才能正确地利用这些优化和特性。

总结起来,'obj'文件只对特定的编译器有效是因为不同的编译器在生成机器代码、符号表和调试信息等方面存在差异,导致生成的'obj'文件格式不同。因此,如果要在不同的编译器之间共享和使用'obj'文件,可能需要进行格式转换或重新编译。

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

相关·内容

为什么c,c++不能跨平台,编译器是在计算机操作系统上吗,难道说编译器不在c,c++程序里吗?

从事软件开发多年对于C/C++比较多,可以明确说这两种编程语言也是支持跨平台,肯定还是有很多人问什么是真正意义上跨平台,所谓跨平台就是同一套代码在不同操作系统都能直接去运行,这里面涉及到一个很重要问题...,在java这门编程语言刚开始流行时候就提到了跨平台功能,在windows上运行jar包直接放在linux上也能直接去运行,单纯从C/C++角度出发也是能够实现这种功能,因为其语法实现是相同。...,这就是编译器存在价值,编译器执行中也是分为几个阶段,对于linux下C语言编译过程有所了解的话,都会发现后缀为 .c 程序文件首先转化成 .o 中间文件,然后经过 .o 转化成可执行二进制文件...编译器其实就是一种转化工具,将程序转化成能够运行二进制文件,一般而言C/C++编译器是可以通用,不同操作系统使用不用编译器底层。 ?...编译器是一种工具包集合,内部实现也涉及到C/C++编程,编译器通常说编程代码还是存在一定差异,编译器是为代码转化做服务,真正实现跨平台基础部件编译器算是一种,因为不同操作系统或者计算机架构需要具体对应实现

2.4K10

Rust 欧洲之声|Rust 和 Cpp 互操作

Slint可以(选择性地)利用现有的C++代码来整合到不同操作系统环境中。这包括像 Widget 样式,可访问性等主题。这就是为什么我们也关心将现有的C++代码暴露在Rust世界中。...在C++方面的情况并没有太大不同:ABI是由编译器定义。这就是为什么你不能混合使用MSVC和GCC生成库。...最常使用绑定生成器是Bindgen[4] 和 Cbindgen[5] 。 Bindgen Bindgen 解析头文件并生成Rust绑定。这对C语言代码很有效,但对C++代码并不完美。...Rust编译器看到是最终notice函数只是定义了obj变量,然后调用了一些以这个obj为参数绑定。 这种方法并没有避免绑定产生,所以这一节标题有误导性。...它允许在build.rs中驱动CC++编译器。这对于构建一些简单文件来说是很理想。对于较大CC++项目,你可能想直接运行项目的构建系统。cmake crate在这里就派上用场了。

3.2K21

c++系列之二 指向成员函数指针(烧脑)

,原文详细解释了C++中指向成员函数指针,因为带有“教程”一词,所以比较通俗易懂。...如果对翻译君翻译质量有意见,建议前往 原地址 围观。 咦?还不走?那废话少说,我们开始了啊。 关于成员函数指针 成员函数指针是C++最少用到语法之一,甚至有经验C++码农有时候也会被它搞晕。...另外,为什么C++如此费心地去发明这样语法?很简单,因为它和常规指针是不同东西,而且这样类型转换也是违反直觉。...因为 “一个指向虚成员指针能在不同地址空间之间传递,只要二者使用对象布局一样” (此话来自C++老爸 Bjarne Stroustrup C++程序设计语言》 )。...成员函数指针和常规指针对比 不同情形下成员函数指针转换规则 如何使用成员函数指针数组来解决特定设计问题 编译器是如何解释成员函数调用 扩展:成员变量指针 http://luodw.cc/2015

2.9K20

makefile终极奥义

进行了编译,省略了没有必要编译步骤 为什么会这样?...Makefile中变量有四种定义(赋值)方式: 1,简单赋值( := ) 编程语言中常规理解赋值方式,只对当前语句变量有效(推荐使用) 2,递归赋值( = )赋值语句可能影响多个变量,所有目标变量相关其他变量都受影响...RM 默认命令是 rm –f 删除文件命令。 命令参数变量 命令 意义 CFLAGS C语言编译器参数。 CXXFLAGS C++语言编译器参数。...Makefile中只有行注释,和UNIXShell脚本一样,其注释是用 # 字符,这个就像C/C++ // 一样。...「顶层目录Makefile」 它除了定义obj-y来指定根目录下要编进程序去文件、子目录外,主要是定义工具链、编译参数 CFLAGS = -g #编译器参数 CFLAGS += -

1.3K30

重学JS-1.3-知识点:V8引擎

比如C语言、C++、Golang等。其转换工具成为编译器。 解释型语言(动态语言) 一边执行一边编译,需要哪些源码就转换哪些源码,不会生成可执行程序。...Java 和 C# 是一种比较奇葩存在,它们是半编译半解释型语言,源代码需要先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。...总结 参考编译型语言和解释型语言区别 类型 原理 优点 缺点 编译型语言 通过专门编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行机器码(以可执行文件形式存在)。...,负责将程序不再需要内存空间回收; Parser和Ignition负责V8编译和执行,这是我们了解编译型语言执行方式,那为什么又会有TurboFan这个编译器呢?...在运行CC++以及Java等程序之前,需要进行编译,不能直接执行源码;但对于JavaScript来说,我们可以直接执行源码(比如:node server.js),它是在运行时候先编译再执行,这种方式被称为即时编译

57110

C++extern关键字知识点

C++C++规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器"脾气"了(不同编译器采用方法不一样),为什么这么做呢,...因为C++支持函数重载啊,在这里不去过多论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意解释!    ...4 问题:extern “C”   在C++环境下使用C函数时候,常常会出现编译器无法找到obj模块中C函数定义,从而导致链接失败情况,应该如何解决这种情况呢?   ...答案与分析:   C++语言在编译时候为了解决函数多态问题,会将函数名和参数联合起来生成一个中间函数名称,而C语言则不会,因此会造成链接时找不到对应函数情况,此时C函数就需要用extern “C...声明了全局变量后,它也同时被定义了;最后,static修饰全局变量作用域只能是本身编译单元,也就是说它“全局”只对本编译单元有效,其他编译单元则看不到它,如:     (1) test1.h:

98340

C语言深入理解extern用法 | 变量声明 | static

因为Demo.c里面的实现会被C编译器处理,然而C++C编译器在编译函数时存在差异,所以会存在找不到函数情况。...被extern “C”限定函数或变量是extern类型: extern是C/C++语言中表明函数和全局变量作用范围(可见性)关键字,该关键字告诉编译器,其声明函数和变量可以在本模块或其它模块中使用...extern “C惯用法 (1)在C++中引用C语言中函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理: extern "C"{ #include "cExample.h...(2)在C中引用C++语言中函数和变量时,C++文件需添加extern”C”,但是在C语言中不能直接引用声明了extern”C该头文件,应该仅将C文件中将C++中定义extern”C”函数声明为...声明了全局变量后,它也同时被定义了;最后,static修饰全局变量作用域只能是本身编译单元,也就是说它“全局”只对本编译单元有效,其他编译单元则看不到它,如: /*test1.h*/ #ifndef

1.2K30

C语言深入理解extern用法 | 变量声明 | static

因为Demo.c里面的实现会被C编译器处理,然而C++C编译器在编译函数时存在差异,所以会存在找不到函数情况。...被extern “C”限定函数或变量是extern类型: extern是C/C++语言中表明函数和全局变量作用范围(可见性)关键字,该关键字告诉编译器,其声明函数和变量可以在本模块或其它模块中使用...extern “C惯用法 (1)在C++中引用C语言中函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理: extern "C"{ #include "cExample.h...(2)在C中引用C++语言中函数和变量时,C++文件需添加extern”C”,但是在C语言中不能直接引用声明了extern”C该头文件,应该仅将C文件中将C++中定义extern”C”函数声明为...声明了全局变量后,它也同时被定义了;最后,static修饰全局变量作用域只能是本身编译单元,也就是说它“全局”只对本编译单元有效,其他编译单元则看不到它,如: /*test1.h*/ #ifndef

1.5K60

extern关键字详解

基本理解 extern放在变量或者函数之前,表示变量或者函数定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。...extern有两个作用 1.当它与"C"一起连用时,如: extern "C" void fun(int a, int b);告诉编译器在编译fun这个函数名时按着C规则去翻译相应函数名而不是C++...C++规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的(不同编译器不同),因为C++支持函数重载。...,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义. static修饰全局变量作用域只能是本身编译单元,也就是说它“全局”只对本编译单元有效,不会影响到其他单元....extern 和const C++中const修饰全局常量据有跟static相同特性,即它们只能作用于本编译模块中,但是const可以与extern连用来声明该常量可以作用于其他编译模块中, 如extern

1.8K10

类和对象 _ 剖析构造、析构与拷贝

C++中,构造函数是专门用于初始化对象方法。当创建类新实例时,构造函数会自动被调用。通过构造函数,我们可以确保对象在创建时就被赋予合适初始状态。...”: 没有合适默认构造函数可用 Date d1; return 0; } 在C++中,如果你没有为类显式定义任何构造函数,编译器会为你自动生成一个默认无参构造函数。...所以我们在使用拷贝构造函数时候要注意避免陷入无限循环: 形参使用引用方式 不在拷贝构造内进行拷贝构造 默认拷贝构造函数 当你没有显式地为类定义一个拷贝构造函数时,C++编译器会自动生成一个默认拷贝构造函数...为什么会崩溃呢?...静态局部对象在函数结束时不会被销毁,因此返回引用仍然是有效

9910

浅析V8引擎,让你更懂JavaScript!

二、静态语言与动态语言 高级语言按照执行方式不同,可分为静态语言和动态语言。 静态语言:使用编译执行语言,如CC++、Golang等。...java和C#是一种比较奇葩存在,它们是半编译半解释型语言,源代码需要先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。...预解析时,只会验证函数语法是否有效、解析函数声明以及确定函数作用域,并不会生成AST,这项工作由Pre-Parser预解析器完成。...3.编译器与解释器区别 4.js引擎能做到多小 5.深入理解JS引擎 6.V8是如何执行JavaScript代码 7.JIT为什么能大幅度提升性能 8.JIT(just-in-time)即时编译...手把手教你从0开始实现C++协程! 阅见深我,读享生活,TVP读书分享会带你解锁新知!

74421

C++最佳实践 | 6. 性能

本系列是开源书C++ Best Practises[1]中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。...本文是该系列第六篇。 C++最佳实践: 1. 工具 2. 代码风格 3. 安全性 4. 可维护性 5. 可移植性及多线程 6. 性能(本文) 7....考虑使用预编译头文件 使用预编译头文件可以大大减少大型项目的编译时间,选定文件被编译成中间形式(PCH文件),编译器可以更快处理。...double是C++中浮点值默认类型,因此推荐作为默认选项。 参考下面的文章获取更多信息: double or float, which is faster?...你永远无法确定代码会不会使用不带优化编译器,因此没有任何理由不这样做。此外,编译器有可能只对整数类型进行优化,而不一定对所有迭代器或其他用户自定义类型进行优化。

75021

C++打怪升级(三)- 内联函数 、auto、范围for循环

---- 引子 在C语言中,我们通常会把完成特定功能代码封装为一个函数,这样函数可能完成者复杂功能从而具有较多代码长度,同时也有着许许多多只完成简单功能函数,这些函数内部通常只有几行代码。...先说结论:内联函数一般定义在需要调用内联函数文件内,或者直接定义在头文件内,在包含头文件即可。 来看这个错误: 为什么为什么内联函数不能像普通函数那样声明和定义分离呢?...但是这并没有报错,如果这里报错应该是编译错误,但现在报是链接错误,所以编译没问题。 在链接阶段test.o会到其他目标文件中寻找Add函数大有效地址。...当在同一行声明多个变量时,这些变量必须是相同类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来类型定义其他变量 #include using...定义宏常量,一般用于为没有有效指向指针赋值,表示指针空值。

46820

C++调用C链接库会出现问题

int y); #endif C文件 /*-----------c.c--------------*/ int add(int x, int y){ return x+y; } C++调用...obj文件实际命名为_add,而c++命名则不同,为了实现函数重载同样函数名add因参数不同会被编译成不同名字 例如 int add(int , int)==>add@@YAHHH@Z, float...编译cpp.cpp中编译器在cpp文件中发现add(1, 0);调用而函数声明为extern int add(int x, int y);编译器就决定去找[email=add@@YAHHH@Z]add...add(int, int);}编译器就会知道 add(1, 0);调用C风格函数,就会知道去c.obj中找_add(int, int)而不是[email=add@@YAHHH@Z]add@@YAHHH...@Z[/email]; 这也就为什么DLL中常看见extern "C" {},windows是采用C语言编制他首先要考虑到C可以正确调用这些DLL,而用户可能会使用C++而extern "C" {}就会发生作用

1.1K30

ios 笔试题3

(2)在 C 中引用 C++语言中函数和变量时,C++文件需添加 extern "C",但是在 C 语言中不能直接引用声明了 extern "C"该头文件,应该仅将 C 文件中将 C++中定义...10.为什么标准头文件都有类似以下结构?   ...obj-c 如何混用 1)obj-c编译器处理 后缀为m文件时,可以识别obj-cc代码, 处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件...include文件中,也不能出现obj- c代码,因为cpp只是cpp2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题3)在cpp中混用obj- c其实就是使用obj-c...如果模块以函数实现,那么头文件要按 c格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。

69910

不能定义声明dllimport_不允许 dllimport 静态数据成员

一个.cpp及其包括所有.h经编译后叫做一个编译单元,即.obj文件,然后由连接器把所有的.obj连接生成一 个PE可执行.exe文件。...在.cpp中变态地调用自己声明模板。 明白这个道理之后也就不难理解为什么有的时候可以编译通过链接时候却报错了,链接器找不到另一个.obj相应地址当然报错。...当然,如果你DLL里全是C++类的话,你无法在DEF里指定导出函数,只能用__declspec(dllexport)导出类 __declspec(dllimport) 声明一个导入函数,是说这个函数是从别的...当然,如果你DLL里全是C++类的话,你无法在DEF里指定导出函数,只能用__declspec(dllexport)导出 类。...,那就回去看看C++基础。

1.8K20

实战中遇到C++文件重置一个大陷阱 为什么ifstreamseekg函数无效

今天下午遇到这样一个问题: 逐行读取了test.txt文件后, 后续需要继续从头开始重新逐行读取, 用C++怎么做呢?...下面, 我们先在工程当前目录下制作我们需要test.txt文件, 在里面输入几行字符串: ab cd ef gh 我们先看逐行读取文件: #include #include...回忆一下, 在C语言中, 我们有文件指针重置概念, 所以这里我们是不是要考虑一下文件重置呢?...当你完成了一篇文章写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。...导入 如果你想加载一篇你写过.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名文件导入, 继续你创作。

41730

Nebula3 RTTI 小技巧

另外, 因为我没有通过编译器运行这些代码, 不保证有些手误. 不要把Rtti跟RTTI搞混: Rtti 是类名, MyClass::RTTI 是类Rtti对象名字....检查一个对象是否为特定类或者其派生类: 这是Nebula3 RTTI系统标准特性, 可以检查一个对象是否可以安全地转换为特定类接口: // check whether obj is instance...>& res = d3d9Tex.cast(); 不安全转换是最快(在release模式中, 编译器会把这个调用优化掉), 但是很显然它会让你自作自受....另一个问题就是有些类没有在程序启动时注册, 因为它静态RTTI对象构造方法被链接器(linker)给”优化没了”. 这通常是因为没有实际C++代码直接用到这个类....这种条件下, 链接器会完全地抛弃这个类.obj单元, 因为外部没有调用到这个对象单元. 这对于减于可执行文件体积很有效, 并且跟C++静态对象模型工作得很好.

27320

Visual Studio中MD MDd MT MTd含义以及_ITERATOR_DEBUG_LEVEL错误解决方法

if _SECURE_SCL is defined) _ITERATOR_DEBUG_LEVEL = 2 (in debug mode) 网上流行答案都是说在“项目属性/配置属性/ C,C++/预处理器.../配置属性/ C,C++/代码生成/运行库”这里看看你选择是不是“多线程调试(/MTd)”或者“多线程调试DLL(/MDd)”,如果是的话,那就很简单了,既然你要生成RELEASE版本解决方案,当然不能用调试版本运行库了...静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中其他模块组合在一起生成可执行文件.../MDd 定义 _DEBUG、_MT 和 _DLL,并使应用程序使用运行库调试多线程并特定于 DLL 版本。 它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。...此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。

1.6K20

C++初阶】--- C++入门(下)

3.2 范围for使用条件 四、 指针空值nullptr(C++11) 一、内联函数inline 1.1 概念 以inline修饰函数叫做内联函数,编译时C++编译器会在调用内联函数地方展开,没有函数调用建立栈帧开销...于是乎在C++中引出了内联函数概念。 如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数调用。...没有类型安全检查 。 C++有哪些技术替代宏?...2.1 auto简介 在早期C/C++中auto含义是:使用 auto修饰变量,是具有自动存储器局部变量,但遗憾是一直没有人去使用它,大家可思考下为什么?...,这些变量必须是相同类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来类型定义其他变量。

8710
领券