Questions tagged «linker»

链接器是用于从以编译后的编程语言编写的源代码生成可执行文件的工具链的一部分。它在多个文件中获取已编译的目标代码,并从中生成一个单独的“链接”可执行文件。

15
将DLL嵌入已编译的可执行文件中
是否可以将预先存在的DLL嵌入到已编译的C#可执行文件中(以便仅分发一个文件)?如果有可能,人们将如何去做呢? 通常,我很酷,只是把DLL放在外面,让安装程序处理所有事情,但是有几个人在工作,问我这个问题,老实说我不知道​​。
618 c#  .net  dll  merge  linker 


6
编译/链接过程如何工作?
编译和链接过程如何工作? (注意:这本来是Stack Overflow的C ++ FAQ的一个条目。如果您想批评以这种形式提供FAQ的想法,则可以在开始所有这些操作的meta上进行发布。)该问题在C ++聊天室中进行监控,该问题最初是从FAQ想法开始的,所以提出这个想法的人很可能会读懂您的答案。)

4
共享库(.so),静态库(.a)和DLL(.so)之间的区别?
我参与了有关Linux库的一些辩论,并想确认一些事情。 根据我的理解(如果我做错了,请纠正我,稍后我将编辑我的文章)在构建应用程序时有两种使用库的方法: 静态库(.a文件):在链接时,会将整个库的副本放入最终应用程序中,以便调用方应用程序始终可以使用库中的功能 共享对象(.so文件):在链接时,仅通过相应的标头(.h)文件针对其API对对象进行了验证。该库直到需要运行时才真正使用。 静态库的明显优点是它们允许整个应用程序独立运行,而动态库的优点是可以替换“ .so”文件(即:由于安全原因需要更新)错误),而无需重新编译基本应用程序。 我听说有人对共享库和动态链接库(DLL)进行了区分,即使它们都是“ .so”文件。在Linux或任何其他POSIX兼容操作系统(即MINIX,UNIX,QNX等)上进行C / C ++开发时,共享库和DLL之间是否有区别?有人告诉我(到目前为止)一个关键的区别是共享对象仅在运行时使用,而DLL的共享必须首先在应用程序中使用dlopen()调用来打开。 最后,我还听到一些开发人员提到“共享档案”,据我了解,共享档案本身也是静态库,但从未被应用程序直接使用。相反,其他静态库将链接到“共享档案”,以将某些(但不是全部)功能/资源从共享档案中拉到正在构建的静态库中。 预先感谢大家的帮助。 更新资料 在向我提供这些术语的上下文中,必须学习Linux的一组Windows开发人员实际上使用了错误的术语。我试图纠正它们,但是(不正确的)语言规范卡住了。 共享库:程序启动时自动链接到程序的库,并且作为独立文件存在。该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为的库文件mylib.so)。该库必须在编译时以及应用程序启动时存在。 静态库:一个在构建时就合并到实际程序本身的库,用于一个(较大)应用程序,其中包含应用程序代码和在构建程序时自动链接到程序中的库代码,而最终的二进制文件则同时包含这两个程序主程序和库本身作为单个独立的二进制文件存在。该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为mylib.a的库文件)。该库必须在编译时存在。 DLL:本质上与共享库相同,但不是在编译时包含在链接列表中,而是通过dlopen()/ dlsym()命令加载该库,因此该库无需在构建时就存在,即可进行程序编译。同样,该库不需要在应用程序启动或编译时出现(必需),因为仅在进行dlopen/ dlsym调用时才需要。 共享存档:本质上与静态库相同,但是使用“导出共享”和“ -fPIC”标志进行编译。该库在编译时包含在链接列表中(即:LDOPTS+=-lmylibS对于名为的库文件mylibS.a)。两者之间的区别是,如果共享库或DLL希望将共享归档文件静态链接到其自己的代码,并且能够使共享库中的函数可用于其他程序,而不仅仅是使用它们,则需要使用此附加标志。 DLL内部。当有人为您提供静态库并且您希望将其重新打包为SO时,这很有用。该库必须在编译时存在。 附加更新 “ DLL”和“ shared library” 之间的区别只是我当时工作的公司中的一种(懒惰,不准确的)口语(Windows开发人员被迫转移到Linux开发,并且这个术语陷入了僵局),并遵循上述说明。 另外,在S“共享档案”的情况下,库名后的尾随“ ”文字只是该公司的惯例,而不是整个行业。
272 c++  c  linux  dll  linker 


5
解决LNK4098:defaultlib'MSVCRT'与发生冲突
此警告: LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 在Visual Studio中是相当普遍的警告。我想了解它的确切原因以及正确的处理方式(如果有的话)。 这出现在使用进行编译的调试版本中/MDd。该项目链接到诸如Windows之类的东西Version.dll,pdh.dll它们本身也与之链接MSVCRT.dll。显然,我没有这些的调试版本,也无法编译它们。 因此,我将其添加/NODEFAULTLIB:MSVCRT到链接器命令行中,并确实删除了警告。但是,这实际上是做什么的呢?为何有必要?

17
g ++对typeinfo的未定义引用
我只是遇到以下错误(并在线找到了解决方案,但是它在Stack Overflow中不存在): (.gnu.linkonce。[stuff]):对[方法] [目标文件]的未定义引用:( .. gnu.linkonce。[stuff]):对'[classname]的typeinfo的未定义引用 为什么可能会收到这些“对typeinfo的未定义引用”链接器错误之一? (如果您可以解释幕后发生的事情,则可以加分。)
208 c++  linker  g++ 

14
libpthread.so.0:添加符号时出错:命令行缺少DSO
编译openvswitch-1.5.0时,遇到以下编译错误: gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init -g -O2 -export-dynamic ***-lpthread*** -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a /home/jyyoo/src/dpdk/build/lib/librte_eal.a /home/jyyoo/src/dpdk/build/lib/libethdev.a /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a /home/jyyoo/src/dpdk/build/lib/librte_hash.a /home/jyyoo/src/dpdk/build/lib/librte_lpm.a /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a /home/jyyoo/src/dpdk/build/lib/librte_ring.a /home/jyyoo/src/dpdk/build/lib/librte_mempool.a /home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm /usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5' /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing …

11
“ / usr / bin / ld:找不到-lz”
我正在尝试在Ubuntu 10.04下编译Android源代码。我收到一个错误消息, / usr / bin / ld:找不到-lz 你能告诉我如何解决吗?什么cannot find -lz意思 这是完整的错误消息: external/qemu/Makefile.android:1101: warning: overriding commands for target `external/qemu/android/avd/hw-config-defs.h' external/qemu/Makefile.android:933: warning: ignoring old commands for target `external/qemu/android/avd/hw-config-defs.h' host SharedLib: libneo_cgi (out/host/linux-x86/obj/lib/libneo_cgi.so) /usr/bin/ld: skipping incompatible /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../libz.so when searching for -lz /usr/bin/ld: skipping incompatible /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../libz.a when searching for -lz /usr/bin/ld: skipping incompatible …
172 linux  gcc  linker 

7
ld找不到现有的库
我正在尝试在此Debian lenny系统上使用g ++链接应用程序。ld抱怨找不到指定的库。这里的特定示例是ImageMagick,但其他一些库也遇到类似的问题。 我通过以下方式调用链接器: g++ -w (..lots of .o files/include directories/etc..) \ -L/usr/lib -lmagic ld抱怨: /usr/bin/ld: cannot find -lmagic 但是,libmagic存在: $ locate libmagic.so /usr/lib/libmagic.so.1 /usr/lib/libmagic.so.1.0.0 $ ls -all /usr/lib/libmagic.so.1* lrwxrwxrwx 1 root root 17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0 -rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0 $ ldd /usr/lib/libmagic.so.1.0.0 …


5
什么是C中的目标文件?
我正在阅读有关C语言中的库的信息,但尚未找到关于什么是目标文件的解释。其他任何编译文件和目标文件之间的真正区别是什么? 如果有人可以用人类的语言解释,我会很高兴。

6
将静态库链接到其他静态库
我有一小段代码,它依赖于许多静态库(a_1-a_n)。我想将该代码打包在一个静态库中,并提供给其他人。 我的静态库称为X,可以正常编译。 我已经创建了一个简单的示例程序,该示例程序使用了X中的函数,但是当我尝试将其链接到X时,我从库a_1-a_n中收到有关缺少符号的许多错误。 有没有一种方法可以创建一个新的静态库,Y包含X和X所需的所有功能(从a_1-a_n中选择的位),以便我可以仅分发Y以便人们将其程序链接到? 更新: 我看过只是用ar转储所有内容并制作了一个mega-lib,但是最终包含了许多不需要的符号(所有.o文件均为700 MB,但是,静态链接的可执行文件为7 MB)。有没有一种很好的方法可以只包含实际需要的内容? 这看起来与如何将多个C / C ++库合并为一个库密切相关?。
138 c++  linker  ar  .a 

2
直接告诉gcc静态链接库
使用它-Wl,-Bstatic来告诉gcc我要静态链接的库对我来说很奇怪。毕竟我告诉gcc直接有关与库(链接的所有其他信息-Ldir,-llibname)。 是否可以直接告诉gcc驱动程序应静态链接哪些库? 澄清:我知道,如果某个库仅存在于静态版本中,它将在不使用的情况下使用它-Wl,-Bstatic,但是我想暗示gcc更喜欢静态库。我也知道直接指定库文件将与它链接,但是我更喜欢保持包含静态库和动态库的语义相同。

20
错误LNK2038:检测到“ _ITERATOR_DEBUG_LEVEL”不匹配:值“ 0”与main.obj中的值“ 2”不匹配
我已经阅读了很多解决我的问题的方法,但是都没有帮助。我尝试清洁,重建。重新安装了Visual 2010,并从专业版更改为最终版。但是我仍然不知道为什么会有这个错误。我的项目如下所示:1 Exe解决方案,用于测试我的静态库。1 Dll解决方案静态库。转换为dll的代码使用的是来自1个lib的函数,称为ClassificationFramework。我将此lib作为标头和cpp提供,因此基本上是源代码。在Exe解决方案中,我链接了生成的库+一些其他的库以运行它+ ClassificationFramework.dll。当我使用Release时一切正常,但是当我更改为Debug时(因为我想调试一些东西,我厌倦了在发布模式下跳过调试器),我得到了: 2>Link: 2> ClassificationFramework.lib(SampleClass.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance 2>ClassificationFramework.lib(SampleClass.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj 2>ClassificationFramework.lib(SampleNamesSet.obj) : …
131 c++  debugging  linker 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.