代码之家  ›  专栏  ›  技术社区  ›  Mark P Neyer

C++/CLI预编译头:它们是如何工作的?

  •  1
  • Mark P Neyer  · 技术社区  · 16 年前

    我正在尝试编写一个混合模式DLL,我们称之为“客户机”,用它们的托管等价物替换一些非托管类。在我的个人机器上,一切都很好,但是当我签入源代码时,我们的构建机器不会构建项目。它无法识别我正在使用的另一个DLL(称为“Core”)中的托管类

    我认为这个问题与预编译头有关。原因如下:

    为了使用“Core”中的类,我在“Client”项目中添加了对“Core”项目的引用。如果我删除此引用,然后在我的个人计算机上构建项目,它仍然有效。但是,CLR PCH在删除引用后不会重新编译。如果我重新编译CLR PCH,然后编译项目,它将失败,并出现与生成计算机上相同的错误:无法识别托管类。

    在我看来,您导入的DLL中的托管类是在预编译头中定义的。我还没能证实这一点,但这是我最好的猜测。有人对这个问题有什么见解吗?混合DLL中的项目引用是否通过将挂钩放入托管PCH中来解决?

    复制步骤

    以下这些对我来说毫无意义:

    1. 让客户端进行构建。
    2. 重新编译客户端PCH,然后编译客户端。编译客户端失败:“核心”中的类未定义。这是预期的行为。
    3. 添加对核心的引用,编译。编译客户端由于同样的原因失败。这是预料不到的
    4. 重新编译客户端PCH,然后编译客户端。客户编译得很好。

    我从这个实验中得出的结论是,引用是通过预编译头插入到项目中的,并且这种工作方式有问题,至少在我们的构建机器上是这样。

    2 回复  |  直到 16 年前
        1
  •  0
  •   demoncodemonkey    16 年前

    它不能像那样工作,因为不需要使用预编译头。
    PCH所做的只是允许您加速构建。
    它对引用没有任何特殊作用。。。。。

        2
  •  0
  •   Juozas Kontvainis    16 年前

    还有另一种方法可以在C++/CLI中添加对托管/混合模式dll的引用,即将#using Core.dll添加到客户端。这可能会解决您的构建问题。