2

我有一个在 Visual Studio 2010 中编译的 WPF 应用程序,它使用 CLR .dll 与一些非托管 C/C++ 代码进行交互。这个想法是 WPF 引用 CLR .dll 反过来引用非托管代码。不幸的是,我遇到了可怕的链接问题,因为非托管 C/C++ 代码和相关库都静态链接到 C/C++ 运行时,但是如果我尝试在 CLR .dll 上使用该代码生成方法,则会引发错误因为 /clr 选项和静态链接到 CRT 是不兼容的。我需要以某种方式将这些东西粘合在一起。

我的想法是尝试创建一个额外的.dll,它只包含单个包中的所有非托管代码(也静态链接到 CRT),然后将其链接CLR .dll,然后链接到应用程序(blech !)。我试图制作这样一个 .dll,但问题是(可能很明显?)它没有从静态 .lib 文件中提取任何符号,因为它不需要任何符号。我尝试强制符号引用(/OPT:NOREF),但这似乎没有做任何事情。它只是一个“链接”到库的空 .dll,但实际上并没有做任何事情。所以这个想法是一个很大的失败。

我接近这整个事情都错了吗?

我没有一些非托管库的源代码,所以我无法重新编译它们以动态链接到 CRT。这些链接问题变得非常令人沮丧!

感谢您的任何建议!

更新:我想这无异于尝试将模块混合在一起,/MT根据this,这是不可能的。您应该如何链接您无法控制第三方库的项目?您只是希望他们都选择使用相同的运行时库链接方法?!似乎是一个可怕的想法.../MD

4

1 回答 1

3

解决方案似乎是您不应该尝试将-compiled 库链接在一起/MT/MD我对此有点惊讶,因为在某些情况下您可能无法控制必须链接到的库。如果你试图链接到一个 CLR 项目,你最好希望那些库是用 编译的/MD,否则你就有麻烦了!就我而言,我可以通过使用 /MD 重新编译一些外部库来解决它。特别是有一个我无法访问代码,它DEFAULTLIB是一个静态链接的 C 运行时 ( libcmt.lib),但不知何故我能够毫无问题地链接到它。

于 2012-11-20T15:06:51.987 回答