如何重新导出 CLR c++ 静态库

Posted

技术标签:

【中文标题】如何重新导出 CLR c++ 静态库【英文标题】:How to reexport CLR c++ static library 【发布时间】:2011-04-05 12:39:53 【问题描述】:

我有这些文件:

foo.dll foo.lib foo.exp bar.il bar.net 模块

“foo”在其导出目录中定义函数。

我还有一个 Visual Studio 2010 C++ 项目,它将创建一个托管的“bar.dll”

我想用“bar”静态链接到“foo”并重新导出来自“foo”的所有函数。

最后我希望 bar 导出 foo 中的函数以及 foo 中定义的一些附加代码。

使用下面的代码不起作用,因为它引用 foo 而不是将 barfoo 合并。

#pragma comment(linker, "/include:_foomethod@12")

我该怎么做?

另请参阅:http://msdn.microsoft.com/en-us/library/f0z8kac4(v=VS.100).aspx

CFF Explorer 验证导出目录:http://www.ntcore.com/exsuite.php

另见:http://msdn.microsoft.com/en-us/library/k669k83h.aspx

另请参阅:http://blogs.msdn.com/b/texblog/archive/2007/04/05/linking-native-c-into-c-applications.aspx

call "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\link.exe" /DLL /LTCG /CLRIMAGETYPE:IJW   /ASSEMBLYMODULE:bar.netmodule   /OUT:bar.dll foo.lib bar.netmodule

foo.netmodule : fatal error LNK1302: only support linking safe .netmodules; unable to link ijw/native .netmodule

【问题讨论】:

我不确定是否可以将 foo 合并到 bar 中。但是,可以将 bar 中的导出符号转发回 foo,例如正如 kernel32 对 ntdll 中的某些函数所做的那样。如果您只想检查导出库,您还可以在 VS 命令提示符下使用 depends 或 dumpbin /exports bar.dll 【参考方案1】:

我想通了。

这些文件将是必需的:

foo.obj bar.cpp bar.obj

C++/CLI 编译器 cl.exe 将能够编译 bar、引用非托管和托管世界。

在稍后的步骤中,链接器将用于将 obj 文件合并到一个混合模式程序集中,其中包含:

来自 foo 的非托管导出 来自 bar 的非托管导出 来自 bar 的托管 IL 类型

用于链接 obj 文件的命令:

call "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\link.exe" /DLL /LTCG /CLRIMAGETYPE:IJW     /OUT:bar.dll *.obj

额外:可以根据自己的喜好在导出目录中将cpp到obj编译后的导出函数名称重命名:)

【讨论】:

以上是关于如何重新导出 CLR c++ 静态库的主要内容,如果未能解决你的问题,请参考以下文章

C++中动态库调用动态库如何调用啊

Xcode生成静态库和bundle

在Visual C ++中将静态库链接到新项目

如何使用 C++ 静态库编译 C# 应用程序?

linux中,包含静态库的动态库导出时,静态库的函数也被一并导出

如何链接(或解决)两个定义相同符号的第三方静态库?