这是场景,我正在编译3个项目
不要紧是一个静态库,而另一个是动态库(至少我不认为它是动态库)。仅重要的是,其中有三个具有这样的依赖关系,例如 C-> B -> A 。
项目A,项目B和项目C分别位于不同的目录ProjectA,ProjectB和ProjectC
首先,我先使用msvc cl.exe /c ProjectA\a.cpp
编译 a.cpp ,然后创建{strong> A.lib < / p>
b.h 里面有lib.exe a.obj /OUT:A.lib
,以获取静态lib(A.lib)定义的任何符号的声明。然后我使用msvc编译以下内容
#include <a.h>
通知 / I 标志,用于指定包含语句在 a.h
中的位置现在这是个问题所在。 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.lib
和fusion.h
,那么如果它们被命名为其他名称,则编译成功,然后编译器吐出错误并指出找不到命名的fusion.cpp
文件。
.h
// a.h
#pragma once
class ExampleA{
public:
ExampleA(int x);
void foo();
private:
int m_X;
};
// 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();
};
// b.cpp
#include "b.h"
ExampleB::ExampleB(){
ExampleA ea(5);
ea.foo();
}
void ExampleB::bar(){}
// c.h
#pragma once
#include <b.h>