( c++)有个依赖库想更新一下,用新一点的 visual studio 编译,用一些新的 c++特性。给之前用旧 visual studio 编译出来的程序使用。
1
newmlp 2021 年 6 月 29 日
c++不行,C 可以
|
2
codehz 2021 年 6 月 29 日
用 c 接口可以,或者以前的 com 接口
用 c++的话,那得注意看版本号,一般来说 2015-2019 是兼容的(其他版本就互相不兼容了 |
3
12101111 2021 年 6 月 29 日
17,19,22 通用的,其他更早的不行
|
4
xdeng 2021 年 6 月 29 日
可以混用 loadlibrary 加载,同 dll new malloc 出来的数据 用同 dll 的 delete free 即可。
|
5
tabris17 2021 年 6 月 29 日
你用__declspec(dllexport)导出函数,这个是 ABI 兼容的
|
6
kssss 2021 年 6 月 29 日
dll 是通用的和版本没关系
|
7
3dwelcome 2021 年 6 月 29 日
@xdeng "同 dll new malloc 出来的数据 用同 dll 的 delete free 即可。"
我记得 VC 编译器可以专门指定 Runtime 为 DLL,这样就可以跨 DLL 释放内存资源了吧。 |
8
BrettD 2021 年 6 月 29 日 via iPhone
我遇到的一个坑倒不是 Visual Studio,是链接了不同版本的 GCC 和 Clang 编译出来的动态库(两个不同的供应商提供的),会导致 C++抛出异常之后,程序的执行流随机乱飘
|
9
ysc3839 2021 年 6 月 29 日 via Android
@tabris17 declspec dllexport 只是告诉链接器要导出这个符号,不会影响 ABI 。比如不同版本间 C++ ABI 不一致,加了这个那还是不一致。想要保证兼容,需要用 extern "C" 导出为 C 语言的符号。
|
10
ysc3839 2021 年 6 月 29 日 via Android
@3dwelcome 可以使用 DLL 的 crt,但是不同编译器版本编译出来的程序使用的也可能是不同版本的 crt,此时仍然不能跨 DLL 释放内存。
|
11
ysc3839 2021 年 6 月 29 日 via Android
@BrettD C++的异常一般都是内部使用,不会跨越 ABI 边界的。自己 throw 的异常自己 catch,然后正常返回,是不会出现问题的。同时建议给边界函数加上 noexcept,这样如果遇到没有 catch 的异常,会直接终止程序。
|
12
jim9606 2021 年 6 月 29 日
如果导出接口都是 C 接口通常没问题,C++接口你得确保链接相同大版本的 VC 库。VS2015+开始用的 VC Runtime 都是 14.x,确保运行时装的是较新版本的 VC 14 Redist 就行。
|
16
Mithril 2021 年 6 月 30 日
Visual Studio 和 MSVC 不是一个东西。你可以在新版本的 Visual Studio 里面使用老版本的 Toolset,这样可以使用一些新的 Visual Studio 功能。
同时即使是老版本的 MSVC 也可以支持不少新的 C++特性,看看你要用的那些特性在你之前那个版本的编译器里有没有,有的话 /std 选项打开就行了。 |
18
ysc3839 2021 年 6 月 30 日
@byaiu MSVC CRT 能静态链接。风险要具体分析了,如果多个 DLL 都是静态链接的话,不能互相释放内存指针,只能自己用自己的。一般来说为了节省空间,多 DLL 的程序会选择都动态链接。
|
21
asuraa 2021 年 7 月 1 日
微软的 com 技术了解下
|
22
hyrious 2021 年 7 月 12 日 #9 extern "C" 不如 def 好使 https://github.com/hyrious/rgss-railapi-achievements/blob/master/railapi/rail_wrapper.def
以及真的需要 COM 吗( |
23
byaiu OP 追个后续:花了点时间把所有相关项目全部升级到 V142 了……
|