标签: linker

将DLL嵌入已编译的可执行文件中

你知道,我在任何地方都没有看到一个好的答案.是否可以将预先存在的DLL嵌入到已编译的C#可执行文件中(这样您只能分发一个文件)?如果有可能的话,怎么去做呢?

通常情况下,我很酷,只是将DLL放在外面并让安装程序处理所有内容,但是有几个人在工作,他们问我这个,老实说我不知道​​.

.net c# dll merge linker

582
推荐指数
12
解决办法
35万
查看次数

429
推荐指数
8
解决办法
17万
查看次数

编译/链接过程如何工作?

编译和链接过程如何工作?

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ compiler-construction linker c++-faq

395
推荐指数
6
解决办法
19万
查看次数

共享对象(.so),静态库(.a)和DLL(.so)之间的区别?

我参与了关于Linux中的库的一些争论,并想确认一些事情.

这是我的理解(请纠正我,如果我错了,我将在稍后编辑我的帖子),在构建应用程序时有两种使用库的方法:

  1. 静态库(.a文件):在链接时,将整个库的副本放入最终应用程序中,以便库中的函数始终可用于调用应用程序
  2. 共享对象(.so文件):在链接时,仅通过相应的头(.h)文件针对其API验证对象.直到运行时才需要实际使用该库.

静态库的明显优势是他们让整个应用程序是自包含的,而动态库的好处是"所以"文件可以被替换(即:如果它需要更新由于安全bug),无需重新编译基本应用程序.

我听说有些人区分共享对象和动态链接库(DLL),即使它们都是".so"文件.在Linux或任何其他POSIX兼容操作系统(即:MINIX,UNIX,QNX等)上进行C/C++开发时,共享对象和DLL之间是否有任何区别?我被告知一个关键的区别(到目前为止)是共享对象只是在运行时使用,而DLL必须首先使用应用程序中的dlopen()调用打开.

最后,我还听到一些开发人员提到"共享存档",根据我的理解,这些存档也是静态库本身,但直接由应用程序使用.相反,其他静态库将链接到"共享存档",以将一些(但不是全部)功能/资源从共享存档中提取到正在构建的静态库中.

提前谢谢大家的帮助.

更新


在向我提供这些术语的上下文中,Windows开发人员必须学习Linux的实际上是错误的术语.我试图纠正它们,但是(不正确的)语言规范被卡住了.

  1. 共享对象:程序启动时自动链接到程序中的库,作为独立文件存在.该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为的库文件mylib.so).库必须在编译时出现,并在应用程序启动时出现.
  2. 静态库:在构建时合并到实际程序本身的库,用于包含应用程序代码的单个(更大)应用程序和在构建程序时自动链接到程序的库代码,以及包含两者的最终二进制文件主程序和库本身作为单个独立的二进制文件存在.该库在编译时包含在链接列表中(即:LDOPTS+=-lmylib对于名为mylib.a的库文件).库必须在编译时出现.
  3. DLL:基本上相同的共享对象,但是,而不是被包括在编译时链接列表,该库是通过加载dlopen()/ dlsym()命令,以便库不需要存在在构建时对程序进行编译.此外,库不需要在应用程序启动或编译时存在(必要),因为只有在调用dlopen/ dlsym调用时才需要它.
  4. 共享存档:基本上与静态库相同,但使用"export-shared"和"-fPIC"标志进行编译.该库在编译时包含在链接列表中(即:LDOPTS + = - lmylib,LDOPTS+=-lmylibS用于名为mylib mylibS.a.a 的库文件).两者之间的区别在于,如果共享对象或DLL想要将共享存档静态链接到其自己的代码并且能够使共享对象中的函数可用于其他程序而不是仅使用它们,则需要此附加标志. DLL的内部.当有人为您提供静态库,并且您希望将其重新打包为SO时,这非常有用.库必须在编译时出现.

其他更新

" DLL"和" shared library" 之间的区别只是我当时工作的公司(懒惰,不准确)的口语主义(Windows开发人员被迫转向Linux开发,术语卡住),坚持上述说明.

另外,在S"共享档案"的情况下,库名后面的尾随" "字面只是该公司使用的惯例,而不是一般的行业.

c c++ linux dll linker

255
推荐指数
4
解决办法
15万
查看次数

"静态链接"和"动态链接"是什么意思?

我经常听到"静态链接"和"动态链接"这两个术语,通常是用C,C++C#编写的代码,但我对这两者都知之甚少.他们是什么,他们到底在说什么,他们连接的是什么?

c# c++ linker dynamic-linking static-linking

216
推荐指数
4
解决办法
8万
查看次数

解决LNK4098:defaultlib'MSVCRT'与.冲突

这个警告:

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
  with use of other libs; use /NODEFAULTLIB:library
Run Code Online (Sandbox Code Playgroud)

在Visual Studio中是一个相当常见的警告.我想了解它的确切原因以及正确的方法(如果有的话)来处理它.

这出现在一个编译的调试版本中/MDd.该项目与windows之类的东西相关联,Version.dllpdh.dll与之相关MSVCRT.dll.显然,我没有这些的调试版本,无法编译它们.

所以我添加/NODEFAULTLIB:MSVCRT到链接器命令行,它实际上删除了警告.但这实际上做了什么?为什么有必要?

dll linker warnings msvcrt visual-studio

198
推荐指数
5
解决办法
16万
查看次数

g ++ undefined对typeinfo的引用

我只是遇到了以下错误(并在线找到了解决方案,但它在Stack Overflow中不存在):

(.gnu.linkonce.[stuff]):对[方法] [目标文件]的未定义引用:(.gnu.linkonce.[stuff]):对[classname]的`typeinfo的未定义引用

为什么可能会得到这些"未定义的typeinfo引用"链接器错误之一?

(如果你能解释幕后发生的事情,可以给予奖励.)

c++ linker g++

195
推荐指数
11
解决办法
16万
查看次数

奇怪的链接错误:命令行中缺少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 from 
     command line
Run Code Online (Sandbox Code Playgroud)

如果我试着看到它的符号libpthread,它看起来很好.

$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
   199: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 pthread_create@@GLIBC_2.2.5
   173: 0000000000008220  2814 FUNC    LOCAL  DEFAULT   13 __pthread_create_2_1
   462: …
Run Code Online (Sandbox Code Playgroud)

linker gcc compiler-errors undefined-reference

188
推荐指数
7
解决办法
40万
查看次数

ld找不到现有的库

我试图在这个Debian lenny系统上将应用程序与g ++链接起来.ld抱怨它无法找到指定的库.这里的具体示例是ImageMagick,但我也遇到了类似的问题.

我正在调用链接器:

g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic
Run Code Online (Sandbox Code Playgroud)

ld抱怨:

/usr/bin/ld: cannot find -lmagic
Run Code Online (Sandbox Code Playgroud)

然而,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 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0
Run Code Online (Sandbox Code Playgroud)

我如何进一步诊断这个问题,哪些可能是错的?我做的事情完全是愚蠢的吗?

linux linker gcc shared-libraries shared-objects

163
推荐指数
5
解决办法
59万
查看次数

"/ 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 /usr/lib/libz.so when searching for -lz
/usr/bin/ld: skipping incompatible /usr/lib/libz.a when searching for -lz
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/lib/libneo_cgi.so] Error 1
Run Code Online (Sandbox Code Playgroud)

我的GCC版本输出:

scheung@scheung-virtual-box:/media/EXTDIV/mydroid$ gcc --version
gcc …
Run Code Online (Sandbox Code Playgroud)

linux linker gcc

158
推荐指数
8
解决办法
15万
查看次数