gpt4 book ai didi

visual-studio-2008 - 使用 Visual Studio 2010,如何链接到 Visual Studio 2008 生成的 DLL

转载 作者:行者123 更新时间:2023-12-04 01:03:15 27 4
gpt4 key购买 nike

我的问题是:

  • 是否可以链接到VS2008
    使用 VS2010 生成的 DLL?
  • 如果不是,为什么看起来是
    可以链接到静态库
    由VS2008生成。
  • 我看到VS2010现在有一个平台
    工具集选项。但这会让
    人们将其设置为 v90 而不是 v100
    即使他们没有 VS2008
    安装?
  • 即使我使用/Z7 编译器
    switch,为什么我还需要一个
    .pdb 用于调试 DLL。

  • 细节

    我可以使用 Visual Studio 2010 毫无问题地链接到由 Visual Studio 2008 生成的 Leptonica C 静态库。 (有关我如何构建 Leptonica 并链接到它的详细信息,请参阅下面的 引用资料 部分。)

    但是,当我尝试将同一个程序 (leptonlib-1.67\prog\ioformats_reg.c) 与我的 VS2008 生成的 Leptonica DLL 版本链接时,程序崩溃了。调试,我可以看到问题在于 ioformats_reg.c 是这样做的:
    fp = fopen(filename, "rb"); /* in ioformats_reg.c */

    此后不久,在 leptonlib.dll 中完成以下崩溃:
    rewind(fp);                 /* in leptonlib.dll */

    How to link with the correct C Run-Time (CRT) library说:

    A reusable library and all of its users should use the same CRT library types and therefore the same compiler switch...

    If you do choose to mix CRT libraries, remember that you have two separate copies of the CRT, with separate and distinct states, so you must be careful about what you try to do across a CRT-boundary. There are many ways to get into trouble with two CRTs. Here are just a few:

    • There are two separate heaps. You cannot allocate (explicitly with new, malloc, or so on -- or implicitly with strdup, strstreambuf::str, or so on), and then pass the pointer across a CRT-boundary to be freed.
    • You cannot pass a FILE* or file handle across a CRT-boundary and expect the "stdio low-level IO" to work.
    • You cannot set the locale in one and expect the other's locale to be set.

    Beginning with Visual C++ 4.0, the linker will issue a warning (LNK4098) if a resulting module attempts to combine more than one copy of the CRT library. For more information, search the Help file for LNK4098.



    但我愿意 不是 从 VS2010 链接器获取任何 LNK4098 错误消息。

    Leptonica 使用 fopen()、rewind()、fclose() 等,文档将其归类为 Stream I/O 而不是“低级 IO”,但它们确实传递了 FILE ptrs。我想这就是微软所说的“stdio low-level IO”的意思。

    /MD, /MT, /LD (Use Run-Time Library)说:

    All modules passed to a given invocation of the linker must have been compiled with the same run-time library compiler option (/MD, /MT, /LD).



    说所有模块都必须由相同版本的编译器编译。我确实对我的所有模块始终正确地使用/MD(或/MDd)。

    使用 DLL 时,似乎 DLL 不仅必须使用相同的/MD 开关,而且还必须由 VS2010 编译?

    我的测试用例似乎表明与 VS2008 生成的静态库的链接是可行的,但也许我很幸运?为什么在使用 VS2010 时链接到 VS2008 生成的静态库有效,而链接到 VS2008 生成的 DLL 无效?

    这是否意味着我需要提供单独的 DLL 供 VS2008 和 VS2010 用户使用?

    那么新的平台工具集选项呢?即使没有 VS2008,VS2010 用户也可以将其更改为 v900 吗?如果是这样,那么我可以告诉人们为我的 Leptonlib-1.67 项目更改该设置。

    最后,我在创建库时使用/Z7 开关。 /Z7, /Zi, /ZI (Debug Information Format) 上的文档状态:

    /Z7

    Produces an .obj file containing full symbolic debugging information for use with the debugger. The symbolic debugging information includes the names and types of variables, as well as functions and line numbers. No .pdb file is produced.

    For distributors of third-party libraries, there is an advantage to not having a .pdb file. However, the .obj files for the precompiled headers are necessary during the link phase, and debugging. If there is only type information (and no code) in the .pch object files, you will also have to compile with /Yl (Inject PCH Reference for Debug Library).



    我没有使用任何预编译的头文件。但是,只有当我有可用的 .pdb 时,我才能调试我的 Leptonica DLL。即使它说“没有生成 .pdb 文件”。 .pdb 实际上是使用我当前的项目设置生成的。在我的链接器选项中有/PDB 是否会以某种方式覆盖在编译时指定/Z7?

    编辑:另外我应该提到我 上午 即使没有任何 PDB,也能够调试 Leptonica 的静​​态库版本。

    引用

    Leptonica 是 Dan Bloomberg 的开源 C 图像处理库,地址为 http://www.leptonica.com。 .我提供了使用 VS2008/VS2010 构建 Leptonica 的说明,还提供了 windows 二进制文件。

    http://leptonica.com/vs2008doc/building-leptonlib.htmlhttp://leptonica.com/vs2008doc/building-image-libraries.html有关我如何构建 Leptonica 库的详细信息。 http://www.leptonica.org/vs2008doc/building-prog-dir.html讨论我如何链接 ioformats_reg。

    我的 Leptonica VS2008 解决方案可在 http://www.leptonica.com/source/vs2008-1.67.zip 获得.我的二进制库位于 http://leptonica.com/source/leptonica-1.67-win32-lib-include-dirs.zip 的 zip 文件中. Leptonica 的来源是 http://www.leptonica.com/source/leptonlib-1.67.tar.gz

    最佳答案

    我缺少的一点是,当您使用 DLL 时,有 两个 链接器的调用,一次用于 DLL,一次用于与 DLL 链接的应用程序。当您使用静态库时,只有一次调用链接器(创建静态库使用 LIB)。

    因此,DLL 链接到 C 运行时库,与链接到该 DLL 的任何应用程序分开。如果这两个 C 运行时不同,就会出现问题。

    我可以使用 VS2010 调试器查看通过 Debug -> Windows -> Modules 窗口加载了哪些模块。当我与 Leptonica 静态库链接时,我看到了 msvcrt.dll 和 msvcr100d.dll。但是,当我与 Leptonica leptonlibd.dll 链接时,我可以看到 msvcrt.dll、msvcr90d.dll 和 msvcr100d.dll。

    运行“dumpbin/imports leptonlibd.dll”也会显示对 msvcr90d.dll 的引用。

    我想说这个问题有3个解决方案:

  • 人们可以与 Leptonica 静态链接以完全避免该问题。
  • 提供 VS2008 和 VS2010 版本的 leptonlib.dll。
  • 更改 leptonica API,以便任何 FILE 处理或分配内存
    创建只能使用 API 进行操作/释放。我已经在以下位置发布了一个关于此的问题:
    http://code.google.com/p/leptonica/issues/detail?id=45

  • 现在我了解了问题的原因,我可能还会在我的下一个二进制版本中提供一个 VS2010 版本的 DLL。

    我决定不用担心在没有 PDB 的情况下无法调试 DLL。需要调试 Leptonica 的人将拥有源代码,并且可以构建他们自己的调试版本的库(从而制作 PDB)。

    我仍然有兴趣了解 VS2010 的所有者是否可以使用 v90 Platform Toolset 选项,即使他们没有安装 VS2008。 (但我想得越多,我就越怀疑他们能做到。)

    关于visual-studio-2008 - 使用 Visual Studio 2010,如何链接到 Visual Studio 2008 生成的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4171403/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com