MSVC编译器如何知道何时不包括头文件?

时间:2019-12-22 10:03:43

标签: c++ visual-c++ compilation static-libraries libraries

这是场景,我正在编译3个项目

  1. A是静态库A.lib
  2. B是一个动态库(B.dll),可以再次链接 A.lib ()
  3. 是链接到 B.dll ()
  4. 的可执行文件

不要紧是一个静态库,而另一个是动态库(至少我不认为它是动态库)。仅重要的是,其中有三个具有这样的依赖关系,例如 C-> B -> A

  1. 项目A具有 a.h a.cpp
  2. 项目B具有 b.h b.cpp
  3. 项目C具有 c.h c.pp

项目A,项目B和项目C分别位于不同的目录ProjectA,ProjectB和ProjectC

A.lib

首先,我先使用msvc cl.exe /c ProjectA\a.cpp编译 a.cpp ,然后创建{strong> A.lib < / p>

B.dll

b.h 里面有lib.exe a.obj /OUT:A.lib,以获取静态lib(A.lib)定义的任何符号的声明。然后我使用msvc编译以下内容 #include <a.h>

通知 / I 标志,用于指定包含语句在 a.h

中的位置

C.exe

现在这是个问题所在。 ah 包括 bh ,可从 B.dll 获得我需要的任何声明

我尝试使用以下命令将 c.cpp 编译为 c.exe cl.exe /I ProjectA /LD ProjectB\b.cpp A.lib

效果很好 就是问题所在,我不明白编译器如何知道在哪里找到 a.h 。 编译 * c.cpp 时; ch 包括 bh ,但 bh 包括 ah ,如前所述。但是当只编译 c.cpp 时,编译器如何知道在哪里找到 ah ,我没有在编译过程中,指定目录 \ ProjectA

当我使用 / EP 标志仅输出经过预处理的输出时。看来 a.h 没有包含在最终结果中。编译器似乎知道文件“ a.h”存在(如何?),但是它决定不包括它(为什么?)。

编辑

根据建议,我正在提供代码。 我也缩小了问题的范围。似乎与文件名有关。如果ah和a.cpp分别命名为cl.exe /I ProjectB ProjectC\c.cpp B.libfusion.h,那么如果它们被命名为其他名称,则编译成功,然后编译器吐出错误并指出找不到命名的fusion.cpp文件。


ProjectA

.h
// a.h
#pragma once

class ExampleA{
public:
    ExampleA(int x);
    void foo();
private:
    int m_X;
};

ProjectB

// a.cpp
#include "fusion.h"


ExampleA::ExampleA(int x) : m_X(x) {}
void ExampleA::foo(){}
// b.h
#pragma once

#include <a.h>

#ifdef DLL_EXPORT
    #define EXPORT __declspec(dllexport)
#else
    #define EXPORT __declspec(dllimport)
#endif

class EXPORT ExampleB{
public:
    ExampleB();
    void bar();
};

ProjectC

// b.cpp
#include "b.h"

ExampleB::ExampleB(){
    ExampleA ea(5);
    ea.foo();
}
void ExampleB::bar(){}
// c.h
#pragma once
#include <b.h>

0 个答案:

没有答案