C++ 如何在具有依赖项的DLL中使用预编译头

C++ 如何在具有依赖项的DLL中使用预编译头,c++,dll,linker,precompiled-headers,C++,Dll,Linker,Precompiled Headers,我的情况:我正在编写DLL,它有许多类,但我只导出一个: #pragma once #ifdef APIDLL_EXPORTS #define APIDLL_API __declspec(dllexport) #else #define APIDLL_API __declspec(dllimport) #endif class Process; // <-- ApiClient uses pointer to that class, so I forward declare it c

我的情况:我正在编写DLL,它有许多类,但我只导出一个:

#pragma once

#ifdef APIDLL_EXPORTS
#define APIDLL_API __declspec(dllexport)
#else
#define APIDLL_API __declspec(dllimport)
#endif

class Process; // <-- ApiClient uses pointer to that class, so I forward declare it

class APIDLL_API ApiClient
{
    web::http::client::http_client client; // (*) line
public:
    void check(Process * p);
}
由于它是作为DLL编译的,所以当我将它链接到控制台应用程序时,它不会编译。我输入了
includes
目录
ApiClient.h
(因为我导出并且只需要这个)(指向.lib的路径是正确的)。我在(*)行
E0276 name后接“::”时出错必须是类或命名空间名称
。编译器似乎看不到
http\u客户端的定义。因此,如果我在
ApiClient.h
中添加
#include
,一切都很好


但我希望在“pch.h”中有所有需要的依赖项。我是否也应该将其复制到
includes
目录?但是如果我向pch.h添加一些相对路径呢

pch.h文件不应该是等式的一部分。使包含接口的头文件包含它所需的内容。您应该能够在pch.h甚至不存在的项目中使用DLL。@TEDLYNMO好的。在我的例子中,vcpkg集成使cpprestsdk库随处可访问。如果我将DLL发送给某人,我是否也应该为该cpprestsdk提供头文件?或者有没有一种静态编译的方法?您需要提供包含希望用户使用的类/函数/枚举等的标题。只在DLL内部使用的内容不需要包括在内。PCH.H文件绝对不应该包含在包中。如果有人需要包含一个头来获取声明和定义,他们需要这个头。尽你所能隐藏你不想让客户看到的东西。头文件可能对您有用。头文件需要是自包含的,即对于使用的每个符号都有相应的
#inlcude
。您似乎还误用了预编译头。它不是一个可以转储所有所需依赖项的文件,它是一个包含第三方的文件,很少更改其他文件中包含的头,以加快编译速度。
#ifndef PCH_H
#define PCH_H

// add headers that you want to pre-compile here
#include "framework.h"

#include <sstream>
#include <iomanip>

#include <cpprest/http_client.h>
#include <cpprest/json.h>
#include <cpprest/asyncrt_utils.h>

#endif //PCH_H