如何 p/invoke 调用函数仅使用但 C++ 需要 .a/.lib/.o 文件?

Posted

技术标签:

【中文标题】如何 p/invoke 调用函数仅使用但 C++ 需要 .a/.lib/.o 文件?【英文标题】:How p/invoke call function using only but C++ need the .a/.lib/.o files? 【发布时间】:2015-09-22 18:59:19 【问题描述】:

.NET 的 P/invoke 怎么可能只使用 dll 文件来调用 DLL 中的函数,但对于 C++,如果没有 .a/.lib/.o 文件就无法做到这一点?

背景:

我正在尝试使用来自 C++/CLI 应用程序的 C++ 中“编写”的 dll 中的函数,但我告诉过我只有 dll 文件加上标题是不够的,我需要 .a/.lib/@ 987654324@ 文件也是。如何使用 minGw 和 C++/CLI 编译此 dll 不支持 .a 文件,但仅支持 .libs 我将不得不使用 MSVC 编译器/链接器重新编译此 dll。所以我想知道为什么 C# 中这个“简单”的东西会起作用:

[DllImport("foo.dll",
        CallingConvention = CallingConvention.Cdecl,
        EntryPoint="_Z9getNumberv")]
    public static extern int GetNumber();

但是 C++ 中的 dll 需要更多的工作/需要文件。我是一个初学者,所以我可能遗漏了一些东西。

【问题讨论】:

@LucasTrzesniewski:您不需要静态链接的导入库。 @Cheersandhth 是的,我实际上在考虑.def 文件。 您可以简单地创建导入 .lib 文件,一切顺利 【参考方案1】:

可以在 C++ 中使用 GetProcAddress 并直接调用。这类似于 P/Invoke 所做的。

使用导入库是为了使标准链接器能够工作(而 P/Invoke 和 GetProcAddress 绕过链接器)。

【讨论】:

对于 MS 和 GNU 工具,导入库在技术上是不必要的。这只是一种方便。但是 OP 的观点是 C++ 语言 不支持动态库:对于 C++,它只是一个工具问题。

以上是关于如何 p/invoke 调用函数仅使用但 C++ 需要 .a/.lib/.o 文件?的主要内容,如果未能解决你的问题,请参考以下文章

.Net调用非托管代码(P/Invoke与C++InterOP)

P/Invoke Struct with Pointers, C++ from C#

C#高阶与初心:P/Invoke平台调用

调用非托管代码时,CLR 如何封送仅包含单个字段的结构?

在通过 P/Invoke 获得的 C++ 结构上设置 C# 回调

C#/C++ 回调类(非函数)互操作 - 如何?