如何 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
文件,但仅支持 .lib
s 我将不得不使用 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#