【问题标题】:Can I include a DLL generated by GCC in a MSVC project?我可以在 MSVC 项目中包含 GCC 生成的 DLL 吗?
【发布时间】:2021-09-17 06:54:25
【问题描述】:

我正在为 Windows 应用程序从 x86 升级到 x64 的代码库。

部分代码利用了 MSVC 内联汇编块。我不想通过和解释程序集,但我希望保留应用程序这一部分的功能。

我可以使用 GCC 使用内联程序集编译函数以生成 DLL 并将其链接到库的其余部分吗?

编辑 1:(7/7/21) 项目使用的编译器的灵活性是开放的,我目前正在考虑使用 Clang 与 MSVC 一起使用。(也可以使用英特尔 C++ 编译器)如在第一句话是我想在 Windows 上保留的 Windows 应用程序,使用另一个编译器的目的是由于我 1.) 不想重写大量程序集和 2.) 因为我知道 MSVC 不支持 x64内联汇编。到目前为止,clang 似乎正在处理一些关于它如何在程序集块内声明 cmets 和一些命令的问题。该功能是围绕对数据块进行数学运算而构建的,在开发时应该尽可能快,但现在它按预期工作,我不想升级只是维护功能。因此,任何支持内联汇编的编译器都是一种选择。

编辑 2:(21 年 7 月 7 日)我忘了在第一次编辑中提到,我不一定希望将 32 位 DLL 加载到另一个进程中,因为我担心将数据复制到共享内存。我为另一个项目做了类似的解决方案,但数据集大约 8 MB,我担心函数的慢复制时间会导致数学上的时间限制导致应用程序运行时出现问题。(慢,滞后和缓冲是我试图避免的影响。)我不想让它更快,但它绝对不能变得更慢。

【问题讨论】:

  • 你的目标平台是什么?
  • 汇编语言 sn-ps(用于 x86-32)不太可能在 x86-64 下工作。
  • 我不确定您使用的编译器有多大的灵活性(如果有的话),但如果您可以访问clang-cl,就以下方面而言,这可能比gcc 更好MSVC 可操作性——因为这是插入到 MSVC 的标准库和代码生成器中的 clang 前端,这几乎可以保证兼容性。
  • MSVC x64 没有内联汇编块。
  • 答案是“视情况而定”,请提供minimal reproducible example

标签: c++ visual-studio assembly gcc dll


【解决方案1】:

理论上,如果您设法为该 DLL 创建一个纯 C 接口(从 DLL 导出的所有符号都是标准 C 函数)并且不跨“边界”使用内存管理函数(没有混合内存管理),那么您应该至少能够从另一个 (MSVC) 进程动态加载该 DLL 并调用其函数。

不确定是否要对其进行静态链接...可能不会,因为编译器和链接器必须齐头并进(MSVC 编译器+MSVC 链接器或 GCC 编译器+GCC 链接器)。至少在名称修饰方面,GCC 链接器的输出可能与 MSVC 不兼容。

这是我的结构(没有小细节):

Header.h(DLL 和 EXE 中都包含单独的头文件)

//... remember to use your preferred calling convention but be consistent about it

struc Interface{
    void (*func0)();
    void (*func1)(int);
    //...
};

typedef Interface* (*GetInterface)();

DLL (gcc)

#include "Header.h"

//functions implementing specific functionality (not exported)
void f0)(){/*...*/}
void f1)(int){/*...*/}
//...

Interface* getInterface(){//this must be exported from DLL (compiler specific)
    static Interface interface;

    //initialize functions pointers from interface with corresponding functions
    interface.func0 = &f0;
    interface.func1 = &f1;
    //...

    return &interface;
}

EXE (MSVC)

#include "Header.h"
int main(){
    auto dll = LoadLibrary("DLL.dll");
    auto getDllInterface = (GetInstance)GetProcAddress(dll, "getInterface");
    auto* dllInterface = getDllInterface();

    dllInterface->func0();
    dllInterface->func1(123);
    //...
    return 0;
}

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2016-06-05
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多