更具体地说,假设两个编译器都在同一平台(操作系统+指令集)上。但是,其中一个目标文件是由依赖于编译器的代码生成的。另一方面-代码是面向对象的并且尊重封装。我需要这个用于我正在制作的一种框架。目标平台是GCC和Java虚拟机所在的任何系统。实际上,该框架将在每个平台上编译。使用框架用户的编译器由他决定。 最佳答案 只要它们使用相同的目标文件格式并针对相同的机器指令集,您就应该能够链接它们。例如,假设您有两个C编译器,每个编译器都有自己的专有语言扩展。您编译两个不同的文件,一个使用编译器A,另一个使用编译器B。每个源文件都使用其各自编译
这个问题在这里已经有了答案:WhataretherulesaboutusinganunderscoreinaC++identifier?(5个答案)关闭6年前。在我们的项目中,我们决定在成员变量和一些私有(private)/protected方法前加上下划线(因此使用“_”)。在讨论中有人声称不鼓励这样做,因为在某些平台上与某些编译器/链接器不兼容。因为我们希望尽可能便携,所以我想确定一下。我也认为thatprefixingglobalswithunderscoresinC可能是个问题。同样适用于C++链接吗?如果适用,在什么情况下(平台/编译器/链接器)?
如果我在.c中有一个函数,比如voidfoo(intc,charv);...在我的.obj中,这变成了一个名为的符号_foo...根据C名称修改规则。如果我在.cpp文件中有一个类似的函数,那么根据特定于编译器的名称修改规则,这将完全变成另一回事。msvc12会给我们这个:?foo@@YAXHD@Z如果我在.cpp文件中有那个函数foo并且我希望它使用C名称修改规则(假设我可以不重载),我们可以将它声明为extern"C"voidfoo(intc,charv);...在这种情况下,我们又回到了过去_foo...在.obj符号表中。我的问题是,是否可以反其道而行之?如果我想用C函数模拟C
Edit:I'verestoredtheoriginaltitlebutreallywhatIshouldhaveaskedwasthis:'HowdoC++linkershandleclassmethodswhichhavebeendefinedinmultipleobjectfiles'假设我在头文件中定义了一个C++类:classKlass{intObnoxiously_Large_Method(){//manythousandsoflinesofcodehere}}如果我编译一些在多个位置使用“Obnoxiously_Large_Method”的C++代码,生成的目标文件是否始
我正在尝试让Boost库在我的Eclipse中的C++项目中运行。在Boost中使用仅header库时,我可以成功构建,例如使用lambdaheader的“入门”指南中的示例简单程序。我无法让我的项目成功链接到regexBoost库,如本指南后面所示。在我的项目属性->c/c++构建->设置->工具设置选项卡->库中,我在库框中添加了“libboost_regex”,以及“C:\ProgramFiles\boost\boost_1_42_0\bin.v2\libs"添加到库搜索路径框,因为这是所有.lib文件所在的位置。我什至尝试将“libboost_regex-mgw34-mt-d-
我打开了一个旧工作区,它是一个库及其测试工具。它过去工作正常,但现在不行,旧版本的代码也不能工作,但会出现相同的错误。我试过重新创建项目,这也导致了同样的错误。项目设置中似乎没有任何问题,生成的代码在主应用程序中工作。我已经删除了大部分文件并将其减少到最低限度以生成错误。不幸的是,我无法发布该项目,因为它用于生产代码。我遇到的LNK2001链接器错误通常意味着我离开了一个库或忘记实现一个虚函数。然而,这是标准模板库的一部分-并且是一个header。在IOCompletionPort.obj中被列为有问题的代码实际上并没有直接使用std::string,而是调用了一个类:Comms::E
我正在使用C++开发裸机cortex-M3,以获取乐趣和利润。我使用STL库是因为我需要一些容器。我认为通过简单地提供我的分配器它不会向最终的二进制文件添加太多代码,因为你只得到你使用的东西。实际上我什至没想到有任何与STL的链接过程(给我的分配器),因为我认为这都是模板代码。顺便说一下,我正在使用-fno-exception进行编译。不幸的是,我的二进制文件中添加了大约600KB或更多。我用nm查看了最终二进制文件中包含的符号,这对我来说似乎是个笑话。列表太长了,我不会尝试跳过它。虽然有一些弱符号。我还查看了链接器生成的.map文件,我什至找到了scanf符号.text0x00015
链接我正在处理的项目时,链接器出现以下错误:/usr/bin/ld:../IncludesandLibs/lib/libsfml21rca.a(SoundFile.o):undefinedreferencetosymbol'sf_read_short@@libsndfile.so.1.0'/usr/bin/ld:note:'sf_read_short@@libsndfile.so.1.0'isdefinedinDSO/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libsndfile.sosotryaddingittoth
假设一个头文件定义了一个函数模板。现在假设有两个实现文件#include这个头文件,并且它们每个都有一个对函数模板的调用。在两个实现文件中,函数模板都是用相同的类型实例化的。//header.hhtemplatevoidf(constT&o){//...}//impl1.cc#include"header.hh"voidfimpl1(){f(42);}//impl2.cc#include"header.hh"voidfimpl2(){f(24);}链接器可能会提示f()的多个定义。具体来说,如果f()不是模板,那么情况确实如此。为什么链接器不提示f()的多个定义?标准中是否规定链接器必
一个我没有看到答案的问题,但我觉得它很有趣。所有其他线程似乎都在讨论强制问题,即切换到动态链接或只是分配工作负载。我更感兴趣的是真正找出导致链接花费这么长时间的原因。问题是我真的没有看到任何官方方法可以从链接器获取相关指标,至少对于VS链接器而言不是这样。/verbose开关可以让您深入了解链接器正在做什么,但它根本不会给您任何细粒度的时间安排。我一直在考虑从一个工具运行链接器进程,该工具对每行进行实际测量。虽然这不会提供准确的计时,但它可能足够准确以查明链接瓶颈。有谁知道更好的方法,甚至是完成此任务的工具? 最佳答案 在http: