我有一个包含.LIB和.DLL文件的第三方组件.为了使用组件,我将.LIB链接到我的C++程序中,并使用应用程序分发.DLL.提供的功能非常具体,只与我的用户的一小部分相关,但分发.DLL会产生许可费.
这里的一个工作是有两个版本的我的应用程序,一个链接在第三方组件,另一个没有,但我宁愿避免维护和分发第二个构建所涉及的额外时间.
理想情况下,我想简单地从发行版中排除.DLL,但如果我这样做,我会收到错误'此应用程序无法启动,因为找不到XXXXX.DLL.重新安装应用程序可能会解决此问题.这是我可以在我的代码中捕获和处理的异常吗?或者,我可以延迟加载.DLL,直到尝试调用所提供的特定功能,然后处理它,或者只是检查.DLL是否存在并采取相应的行动?
环境是VS 2003和VS 2008.
我遇到了运行时错误.
anyfile.cpp(60):E_FATAL:无法启动进程libprocbase_so.so(/opt/company/processes/sharedbase_so.so:undefined symbol:_ZTV16CResourceManager)
我发现_ZTV16CResourceManager的含义是资源管理器的虚拟表,
知道为什么会这样吗?怎么解决?
我想知道在具有虚拟内存支持的系统上实际意味着什么是加载时重定位.我认为在具有虚拟内存的系统中,每个可执行文件都将具有从零开始的地址,并且在运行时,地址将被转换为物理地址使用因此,可执行文件可以加载到内存中的任何位置,而无需任何重定位.但是,有关共享库的这篇文章提到链接器指定可执行文件中要加载可执行文件的地址(入口点地址).
http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries/
还有许多关于动态链接的文章谈论绝对地址.我的理解错了吗?
我有一个共享库(libhoard.so),我试图用简单的测试二进制文件链接.但是,根据我在共享库上编译的机器不会显示在测试二进制文件中.我不确定机器上存在什么差异,这也是我提出这个问题的部分原因. 我很好奇我可以做些什么来解决为什么共享库没有显示在"损坏"的机器上的测试二进制文件?
我使用此命令编译两个二进制文件(libhoard.so在同一目录中):
$ g++ -L. -lhoard hoard_test.o
Run Code Online (Sandbox Code Playgroud)
破机:
$ ldd a.out
linux-gate.so.1 => (0x00858000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x004dc000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00aaf000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00675000)
/lib/ld-linux.so.2 (0x00d18000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x0040d000)
Run Code Online (Sandbox Code Playgroud)
工作机器:
$ ldd a.out
linux-gate.so.1 => (0x00110000)
libhoard.so (0x00111000) <----------------- THERE IT IS!
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x03ba8000)
libm.so.6 => /lib/libm.so.6 (0x007a9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00bf7000)
libc.so.6 => /lib/libc.so.6 (0x0063e000)
libdl.so.2 => /lib/libdl.so.2 (0x007d4000)
libpthread.so.0 => /lib/libpthread.so.0 (0x007db000)
/lib/ld-linux.so.2 (0x0061e000)
Run Code Online (Sandbox Code Playgroud)
这是一些随机版本信息:
破机:
$ uname -srv
Linux 2.6.38-11-generic #50-Ubuntu …Run Code Online (Sandbox Code Playgroud) 众所周知,linux调用ldconfig加载所有*.so库,然后链接使用共享库的应用程序.但是,我很困惑全局变量在这种情况下是如何工作的.由于所有这些应用程序中只有一个共享库副本,它们是否共享共享库中的全局变量?如果是,那他们如何同步?
谢谢,
我希望将OpenCL库用于需要分发给许多(1000s)机器的程序.因为程序的大小是一个问题,我想知道静态链接OpenCL库是否有意义.OpenCL是否足够轻量级应用于此应用程序?
distributed-computing dynamic-linking static-libraries opencl
当我编译一个使用g ++使用STL的程序时,库如何链接到我的程序?动态还是静态?
对我来说静态听起来很奇怪,因为这意味着每个使用STL的C++程序都必须在内部包含它.另一方面,动态链接声音对我来说也很奇怪,因为所有的OOP内容我都没有看到库如何动态链接并且还支持不同类型的对象......
那究竟发生了什么?
我有两个可动态加载的库lib_smtp.so和libpop.so等.它们都有一个名为的全局变量protocol,它分别被初始化为"SMTP"和"POP".我有另一个静态库libhttp.a,其中protocol初始化为"HTTP".
现在由于某种原因,我需要静态编译所有动态可链接和可加载库并包含在可执行文件中.这样做我在链接静态库时遇到错误" 符号的多重定义 ".
我很想知道链接器在动态链接期间如何解析重复的符号,其中所有三个提到的库都被链接了?
有没有什么方法可以静态地做链接器在动态链接中做的那样,即没有任何冲突将所有静态库添加到具有相同符号的可执行文件?如果没有,为什么静态链接库的过程不同.
OpenGL API的用户通常使用诸如GLEW之类的库,或者很高兴在运行时加载OpenGL函数.为什么动态加载首选链接方法?
静态链接显然不是一种选择,因为使用OpenGL的程序通常由作者编译并分发给具有针对其特定图形卡的不同OpenGL库的用户.
这留下了动态链接和动态加载.似乎动态链接可以工作,因为我们知道我们想要访问的所有函数的名称.
动态链接是否可行?如果没有,为什么?如果是这样,为什么动态加载是首选?
我使用安装Arch Linux与决斗启动的Linux Mint 18.1.在我的大学里我们安装了lubuntu 16.04和Ubuntu 14.04.我还在arch Linux中启用了测试repos,因此我获得了更新的软件包,因此当我在Arch上编译任何C++程序时,由于共享库的版本不匹配而无法在Linux Mint上运行.
就像libMango.so.64一样,而libMango.so.60也是如此.我怎么能克服这个?
所以我要问如何使用较新的编译器和共享库来编译任何C/C++,以便与旧的共享库一起运行?就像我在带有-m32标志的64位机器上编译32位程序一样,旧共享库也有标志吗?
我正在使用gcc 8.1.