静态库是否可以避免名称篡改问题
Does static library avoids name mangling issues?
我有一个用Visual Studio 2003 SP1编写的C++\MFC应用程序链接到外部静态库"SomeExtStaticLib.lib"。我还包括"SomeExtStaticLib.lib"提供的头文件,用于在我的应用程序中创建对象。
SomeExtStaticLib.lib是一个使用VC6构建的静态库。
现在,我正在将我的应用程序迁移到Visual Studio 2008。
我有一个非常基本的问题。
我还应该将"SomeExtStaticLib.lib"迁移到VS2008编译的版本吗?当我试图在我的VC9编译的应用程序中使用这个VC6编译的"SomeExtStaticLib.lib"时,它没有出现任何链接器错误。我本以为至少会有一些名字混乱的问题。
静态库是否消除了名称篡改问题?
问题不在于静态链接与动态链接,也不在于名称损毁。问题是使用的所有东西的二进制兼容性在界面中。因此,例如,除非我大错特错std::string
的定义在VC6和VC9之间发生了变化不同的布局。因此,如果任何代码使用std::string
重新编译,或者在运行时出现奇怪且无法解释的错误。
一般来说,最好假设没有二进制兼容性编译器的不同版本,甚至不同的编译除非供应商另有保证,否则会涉及选项。(尽管一些常识是有序的:你可以自由地混合选项例如控制警告。但要注意/D
,它会导致添加是否要生成调试代码。)
如果应用程序保持不变,则需要库中的相同符号集。因此,也许您可以链接到使用VC6.0编译的库。除非应用程序和库与VC6.0中的兼容(工作)程序和库相同,否则根本不需要考虑名称篡改。
我是否也应该将SomeExtStaticLib.lib
迁移到VS2008编译的版本
VC6.0和visual 2008之间存在兼容性问题。所以是您应该使用Visual 2008重建您的库。
仅仅因为你可以按原样链接到库并不意味着它会正常工作。
静态库是否消除了名称篡改问题
不是。他们根本没有做什么特别的事。
静态库与名称篡改无关。。。。如果您的代码是C++,则存在损坏,如果它是C(或C++中的外部"C"),则不存在损坏。只要库和链接它的代码一致,在库中链接就没有问题。
- 这个极客对极客的trie实现是否存在内存泄漏问题
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 这种比较是否不一致(或者存在其他问题)?
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- 对于这个问题,是否有更好的数据结构和算法选择
- 用于检测函数是否存在的C++元函数的问题
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- 平衡括号问题为什么要检查它是否为空?
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?
- 虚拟 CTOR 的克隆函数实现是否有问题
- 检查 std::any 变量是否包含 std::string 时出现问题
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- 关于使用ifstream在C 中确定文件是否存在的问题
- 这个危险指针示例是否因为 ABA 问题而存在缺陷?
- 是否有可能存在不会崩溃程序的内存问题
- 将GCC版本升级到发行版附带的版本以外的版本是否有任何问题
- 在检查传递函数标识符时是否获得模板参数时遇到问题
- 检查是否所有 std::元组元素都满足条件 + 设计问题
- 在使用__file__,__line__时,是否存在任何兼容性问题