【问题标题】:Using a DLL with unmanaged code in Visual Studio 2010?在 Visual Studio 2010 中使用带有非托管代码的 DLL?
【发布时间】:2010-11-22 03:48:16
【问题描述】:

我对 C++ 还很陌生,并且正在尝试将TagLib library 用于我正在从事的项目。我在 Windows 7 64 位的 Visual Studio 2010 中使用非托管 C++。我以前从未使用过外部库,所以我很困惑如何去做。

this blog entry 我得到了 libtaglib.a 和 taglib.dll 文件。我遇到了this SO question 关于如何使用 TagLib 的问题,但它处理的是 QT Creator,而不是 Visual Studio,而且我对该主题的了解不足,无法理解将其转化为 Visual Studio 所需的内容。

所以,一些问题:

  • 甚至可以用非托管代码做到这一点吗?
  • .a 文件的具体功能是什么?
  • 最重要的是,如何在我的程序中使用 taglib.dll??

我一直在谷歌上寻找一种方法来做到这一点,但我的主要问题是我遇到的所有事情都超出了我的想象。如果需要更多信息,请告诉我。很感谢任何形式的帮助!谢谢!

【问题讨论】:

  • 考虑到没有托管 C++ 代码之类的东西,这里的“非托管”不是多余的吗?
  • @Billy,以前有微软的托管 C++ 或 C++/CLI,我不知道它是否还在...
  • @Eli:那将是“C++ 托管扩展”或“C++/CLI”,它们不是 C++(它们是完全不同的语言)
  • @Billy,如果“对 C++ 相当陌生”的 OP 无法看到非关系,我不会感到惊讶
  • @Eli:这就是我问这个问题的原因。我尝试通过提问来进行教学。有时它很有帮助。其他时候OP根本没有回应,然后我最终看起来像个刺。哦,好吧。

标签: c++ visual-studio-2010 dll


【解决方案1】:

我似乎已经成功地让它工作了。以下是我所做的粗略概述:

1.) 我使用 CMake 生成 Visual Studio 解决方案。

2.) 我尝试在VS解决方案中构建标签项目,但失败了。

3.) 我对此处概述的一些源文件进行了更正:http://old.nabble.com/taglib-fails-to-compile-with-MS-VC%2B%2B-2010-td29185593.html

4.) 我在发布模式下再次构建了标签项目。这次成功了。

5.) 我将生成的 dll、def 和 lib 文件复制到与我的项目的源文件相同的目录中。

6.) 我将头文件从 taglib 源复制到我项目的子目录中(不确定这是否完全是好的做法)

7.) 在我的项目设置中,我将带有头文件的子目录设置为附加的包含目录。

8.) 我只需转到 Add>Existing Item 即可将 dll、exp 和 lib 文件添加到我的项目中。

9.) 我从 taglib 示例中添加了一些代码并构建了它。一切正常,所以我想我明白了。

我遇到了一个警告,因为 DLL 是在发布模式下构建的,所以我的项目必须在发布模式下运行,否则它会崩溃。我猜如果我用内置的调试模式替换 DLL,我可以在调试模式下运行我的程序,但我还没有尝试过。

【讨论】:

    【解决方案2】:

    您不能在 Visual Studio 中使用特定于 GCC 的库(您可以知道,因为它们具有 .a 扩展名)。您必须从源代码构建库才能与 MSVC 一起使用。完成此操作后,只需将构建过程生成的.lib 添加到您的项目中,一切就可以开箱即用了。 (请注意,无论您是否为动态链接进行编译,都需要.lib——这在 msvc 领域并不重要)

    编辑 -- 在查看 TagLib 本身之后 --

    为了编译 TagLib,您需要获取 CMake build systemTagLib itself,并让 CMake 为您构建一个 Visual Studio 解决方案。使用该解决方案,您将能够构建您需要的.libs 和.dlls。请注意,因为 TagLib 是一个 KDE 库,所以您可能还需要构建一些 QT 位才能使一切正常工作。但是,我对图书馆没有具体的经验,所以我不会在这里提供那么大的帮助。

    【讨论】:

    • 我使用 CMake 生成了一个包含五个项目(ALL_BUILD、INSTALL、tag、tag_c 和 ZERO_CHECK)的 VS 解决方案。其中两个构建成功,两个失败,一个被跳过。我只需要构建标签项目吗?如果是这样,那就是失败了。我知道你对这个库没有任何经验,但问一下也无妨。另外,需要一些 QT 位才能让一切正常工作是什么意思?
    • @S201:对不起,我真的不知道。 Qt 是一个库 (qt.nokia.com/products),所有的 KDE 库都在它​​之上构建。对不起,我不能再有用了:(
    • BIlly,感谢您的帮助。我今天又玩了几个小时,我想我把一切都搞定了。我在下面的答案中发布了一个粗略的大纲。
    【解决方案3】:

    如果您有 .dll 文件,则不必重新编译源代码(以创建 .lib 文件)。使用 dumpbin /exports 和 lib(两者都随 Visual Studio 提供),您可以创建一个可以与您的应用程序链接的 lib。在这个链接中你可以看到一个很好的解释:http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

    但正如比利所说,您可能需要 QT 的其他部分才能使用这个库。

    【讨论】:

    • 感谢路易斯的回答。我使用您提供的指南从我拥有的 dll 生成一个 lib 文件。我的问题是现在我该怎么办?我将它添加到我的项目 VS 项目中。我应该包含库的头文件,对吗?将头文件复制到与我的VS项目相同的目录并将“#include ”放入我的程序中是否简单?另外,正如我在上面问过的比利,你说需要 QT 的其他部分来使用这个库是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多