Tag: 链接器

“静态链接”和“dynamic链接”是什么意思?

我经常听到“静态链接”和“dynamic链接”这两个术语,通常涉及用C , C ++或C#编写的代码,但对于这两者我都不太了解。 他们究竟是什么,他们到底在说什么,他们之间有什么联系?

GCC C ++链接器错误:未定义的引用'XXX的虚拟表',未定义的引用'ClassName :: ClassName()'

我使用Eclipse-CDT在Ubuntu x64上设置了一个C ++项目。 我基本上正在做一个你好的世界,并链接到商业第三方图书馆。 我已经包含链接到他们的库的头文件,但我仍然得到链接器错误。 除了显而易见的情况之外,是否还有其他一些可能的问题(例如,我确信我链接到了正确的库)。 有没有办法确认我连接的静态库是64位? 有没有办法确认图书馆有我期待的类(和方法)? Eclipse说: build立目标:LinkProblem 调用:GCC C ++链接器 g ++ -L / home / notroot / workspace / somelib-3 / somelib / target / bin -o“LinkProblem”./src/LinkProblem.o -lsomelib1 -lpthread -lsomelib2 -lsomelib3 ./src/LinkProblem.o:在函数`main'中: /home/notroot/workspace/LinkProblem/Debug/../src/LinkProblem.cpp:17:对“SomeClass :: close()”的未定义引用 ./src/LinkProblem.o:在函数SomeOtherClass中: /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148:对SomeClass :: SomeClass()的未定义引用 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148:未定义对“SomeOtherClass的vtable”的引用 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:151:对SomeClass ::〜SomeClass()的未定义引用 ./src/LinkProblem.o:在函数`〜SomeOtherClass'中: /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140:未定义对“SomeOtherClass的vtable”的引用 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140:对SomeClass ::〜SomeClass()的未定义引用 /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140:对SomeClass ::〜SomeClass()的未定义引用 collect2:ld返回1退出状态 make:*** [LinkProblem]错误1

如何使用Visual Studio Express 2005完全静态链接.exe?

我目前首选的C ++环境是免费的,基本上非常出色的Microsoft Visual Studio 2005 Express版本。 我不时有发送.exe文件给其他人的结果令人满意。 然而最近我发现了一个令人不安的发现,那就是我喜欢的运气多得令人满意。 试图在一个旧的(2001年份,没有仔细更新的)XP盒子上运行这些程序中的一个,只给了我一个讨厌的“系统无法运行x.exe”(或类似的)消息。 一些谷歌search显示,使用这个工具集,甚至指定静态链接结果在一个简单的hello-world.exe实际上依靠额外的.dll文件(msvcm80.dll等)。 一个令人难以置信的精心版本计划系统(清单文件任何人?),然后将不会让.exe运行没有完全正确的.dll版本。 我不想或不需要这些东西,我只想要一个老式的自包含的.exe,除了最低的共同点Win32操作之外什么也不做,可以运行在任何老式的win32操作系统上。 有谁知道是否有可能做我想用我现有的工具集? 谢谢。

用C覆盖函数调用

为了logging调用,我想覆盖对各种API的某些函数调用,但是在将数据发送到实际函数之前,我也可能想要处理它们。 例如,假设我在源代码中使用了一个名为getObjectName的函数数千次。 我想暂时重写这个函数,因为我想改变这个函数的行为来查看不同的结果。 我创build一个像这样的新的源文件: #include <apiheader.h> const char *getObjectName (object *anObject) { if (anObject == NULL) return "(null)"; else return "name should be here"; } 我通常会编译所有其他的源代码,但是在与API库连接之前,首先将它与此函数链接起来。 这工作正常,除了我可以显然不调用我的重写函数内的真正的function。 有没有更容易的方法来“重写”一个函数,而不会得到链接/编译错误/警告? 理想情况下,我希望能够通过编译和链接一个或多个额外的文件来重写该函数,而不是绕过链接选项或更改我的程序的实际源代码。

-all_load链接器标志是做什么的?

在编译Objective-C代码时,我找不到-all_load标志所做的任何地方。 我有一些问题上传到苹果的二进制文件,他们说这是因为我没有使用这个标志,但我的代码编译即使没有它。 有人能帮我吗? 谢谢

静态variables初始化顺序

C ++保证编译单元(.cpp文件)中的variables按照声明的顺序进行初始化。 对于编译单元的数量,这个规则分别适用于每一个(我是指类之外的静态variables)。 但是,variables初始化的顺序在不同的编译单元中是不确定的。 我在哪里可以看到关于gcc和MSVC的这个命令的一些解释(我知道依靠这是一个非常糟糕的主意 – 这只是为了理解我们在移植到新的GCC主要和不同的操作系统时可能会遇到的问题) ?

将模板化的C ++类拆分成.hpp / .cpp文件 – 可以吗?

我遇到了错误,试图编译一个.hpp和.cpp文件之间拆分的C ++模板类: $ g++ -c -o main.o main.cpp $ g++ -c -o stack.o stack.cpp $ g++ -o main main.o stack.o main.o: In function `main': main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()' main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()' collect2: ld returned 1 exit status make: *** [program] Error 1 这是我的代码: stack.hpp : #ifndef _STACK_HPP #define _STACK_HPP template <typename Type> […]

为什么gcc中'-l'选项的顺序很重要?

我想编译一个使用udis86库的程序。 其实我正在使用图书馆用户手册中给出的示例程序。 但是在编译时,它会给出错误。 我得到的错误是: example.c:(.text+0x7): undefined reference to 'ud_init' example.c:(.text+0x7): undefined reference to 'ud_set_input_file' . . example.c:(.text+0x7): undefined reference to 'ud_insn_asm' 我正在使用的命令是: $ gcc -ludis86 example.c -o example 如用户手册中的说明。 显然,链接器不能链接libudis库。 但如果我改变我的命令: $ gcc example.c -ludis86 -o example 它开始工作。 那么可以请某人解释第一个命令有什么问题?

为什么在使用模板时会出现“无法parsing的外部符号”错误?

当我使用模板为一个类编写C ++代码,并在源(CPP)文件和头文件(H)之间拆分代码时,在链接最后的可执行文件时,会出现大量“无法parsing的外部符号”尽pipe目标文件被正确构build并包含在链接中。 这里发生了什么,我该如何解决?

将DLLembedded到已编译的可执行文件中

你知道,我没有看到这个地方有一个很好的答案。 是否有可能将预先存在的DLLembedded已编译的C#可执行文件(以便只有一个文件需要分发)? 如果可能的话,怎么去做呢? 通常情况下,我只是把DLL留在外面,让安装程序处理所有的事情,但是有很多人问我这个问题,而且我真的不知道。