- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道,如果我将我的 C++ 程序链接到使用不同版本的 Visual Studio 构建的动态库 (DLL),由于二进制兼容性问题,它将无法运行。(我在 Boost 库和 VS 2005 和 2008 中经历过这种情况)
但我的问题是:所有版本的 MSVS 都是这样吗?这是否也适用于静态库 (LIB)?这也是 GCC 和 Linux 的问题吗?最后如何在 VS 中链接到使用 MinGW 构建的 DLL?
顺便说一句,除了跨平台或跨编译器,为什么同一个编译器(VS)的两个版本不能兼容?
最佳答案
Hi. I know that if I link my c++ program to a dynamic library (DLL) that was built with a different version of Visual Studio, it won't work because of the binary compatibility issue. (I have experienced this with Boost library and VS 2005 and 2008)
我不记得曾见过 MS 更改 ABI,因此技术上不同版本的编译器将产生相同的输出(给定相同的标志(见下文))。
因此我认为这不是 Dev Studio 中的不兼容性,而是 Boost 中的变化。
不同版本的 boost 不向后兼容(在二进制中,源代码它们是向后兼容的)。
But my question is: is this true for all versions of MSVS?
我不认为有问题。现在,如果您使用不同的标志,您可以使目标文件不兼容。这就是为什么将调试/发布二进制文件构建到单独的目录中并链接到不同版本的标准运行时的原因。
Does this apply to static libraries(LIB) as well?
您必须链接到正确的静态库。但是一旦静态库在您的代码中,它就会卡在那里,所有已解析的名称都不会在以后重新解析。
Is this an issue with GCC & Linux as well?
是的。 GCC 已经多次破坏 ABI 中的向后兼容性(有几次是故意的(有些是错误的))。这不是一个真正的问题,因为在 Linux 上代码通常作为源代码分发,您在您的平台上编译它就可以工作。
and finally how about linking in VS to a DLL built with MinGW?
对不起,我不知道。
By the way aside from cross-platform or cross-compiler, why can't two version of the same compiler(VS) be compatibile?
充分优化的代码对象可能会被压缩得更多,因此对齐方式不同。其他编译器标志可能会影响生成与其他二进制对象不兼容的代码的方式(更改调用函数的方式(堆栈上的所有参数或寄存器中的某些参数))。从技术上讲,只有使用完全相同的标志编译的对象才应该链接在一起(从技术上讲,它比这有点宽松,因为很多标志不会影响二进制兼容性)。
请注意,某些库随同一个库的多个版本一起发布,这些版本以不同的方式编译。您通常通过末尾的扩展名来区分库。在我上一份工作中,我们使用了以下约定。
libASR.dll // A Sincgle threaded Relase version lib
libASD.dll // A Single threaded Debug version
libAMR.dll // A Multi threaded Release version
libAMD.dll // A Multi threaded Debug version
关于C++ 动态库编译/链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757566/
http://www.vex.net/~trebla/haskell/so.xhtml描述如何编译共享库。 关于编译命令: ghc -O2 -dynamic -shared -fPIC -o libE
我想从Rust调用一个C++动态库(* .so),但是我不想从Rust构建它。像这样, cc::Build::new() .file("src/foo.cc") .shared_fla
我想问一下,打包在ear中的war是否可以使用war文件中没有打包的库。我想在文件系统上拥有包含库的目录,部署的 war 文件将从该目录加载库。我还没有找到如何执行此操作的示例。所以我想问一下部署的w
我正在制作一个 C++ 库。在库中,我正在使用另一个静态库中的一些函数(例如 ref.a)。 我想生成一个库文件,mylib.a 或 mylib.so,这样使用我的库的任何程序都不需要链接到静态库 (
我正在尝试在 linux 中为一个使用 opencv 和 tesseract 以及动态链接的程序创建一个共享库 我关注了link我的代码如下 g++ -c Serial_Key.cpp -fPIC -
[编辑:简而言之,问题是:当我链接到一个链接到另一个动态库的动态库时,我是否也必须显式链接到那个?] 我在一个软件中看到了类似的东西。它不起作用,现在我想知道它是否应该起作用。我可以将库“bar”动态
我的项目中有一堆 Dll,使用 VStudio 9.0 编译器,预编译头文件用于我所有的 Dll。 dll 的加载过程由隐式调用程序完成(必须提供.dll、.lib 和 header )。 我通常为每
在我开始开发更多的 c++ 项目之前,我想建立一个良好的多平台环境并使用一些基本形式的修订 (rsync)。为此,我学习了如何构建 makefile(使用 uname 变量)并且还开始在 Window
我测试试,导出dll成功了,但是调用exe编译失败。 后来把声明代码改为了dllexport,调用exe编译成功了,调用也成功。 #pragma once #ifdef YOLOFACE_DLL_AP
我的问题很简单。有什么方法可以反编译、逆向工程 DYLIB 文件(MAC 的动态库,如 Windows DLL)。? 推荐什么程序这样做? 我正在寻找类似 Olly 或 IDA 之类的程序,但适用于
我已将我的应用提交到App Store,但遭到拒绝。我收到一封电子邮件,说: 无效的捆绑包-dylib搜索路径中不存在您的应用程序引用的一个或多个动态库。 我没有使用CocoaPods,所以所有外部框
我在 CPython 中使用 pythonnet,并且我成功安装了它 import clr clr.AddReference('Assembly') 确实有效。 在我的 C# 代码中,如果是成员 pu
GCC 简介有一个例子: $ gcc -Wall -L. main.c -lhello -o hello The option ‘-L.’ is needed to add the current d
我知道当您使用 dlopen() 加载动态 C++ 库时,您可以获得指向该库内函数的指针,但是有没有一种方法可以有效地(性能很重要)另一个怎么办? 我知道我可以在库中调用一个函数(在初始化库时),将一
给程序和库添加版本号和库,有利于维护和升级。 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本。所
我正在尝试将我的 C 程序链接到静态库和动态库以查看差异。我怎么做?我制作了自己的 Makefile: # ------ executable rule ----------- app : app.
假设我想创建一个动态库 dynamic.so,但我的代码引用了某个其他静态库 static.a 中存在的函数。自然地,如果我使用 g++ 和 -shared 选项进行编译和链接,dynamic.so
我想使用 alarm函数有一个中断来安排对 fcntl + F_SETLKW 的阻塞调用超时(用于锁定文件获取)。但是,我的代码位于共享库/dylib(主机应用程序的插件)中,alarm 的文档指出这
【目录】 第一个动态库文件 应用程序 第二个动态库文件 错误做法:直接给它改名 正解:patchelf 工具 One More Thing
什么是模块化编程 模块化编程就是我们一个复杂的项目分成很多模块,比如一个单片机项目,就可能分为:主函数模块,液晶显示和数码管显示模块,时间延时模块,温度传感器模块等。而一个程序工程包含多个源文件(.c
我是一名优秀的程序员,十分优秀!