首页 > 解决方案 > 如何将预编译头文件与动态库和控制台应用程序一起使用?

问题描述

我有预编译头的问题。看起来有点像

ftpch.h


#pragma once
#include <vector>
#include <iostream>
#include <string>

#include <Windows.h>

ftpch.cpp

#include "ftpch.h"

然后我的 dll 库中有一个头文件和 cpp。测试.h

#pragma once

// DLL_EXPORT is a macro that changes for dll and console app like that:
// __declspec(dllexport) and __declspec(dllimport)

class DLL_EXPORT Test
{
    std::string foo() {return "ara ara"};
}

当我编译我的动态库项目时,这段代码编译得很好,但是当我在我的控制台应用程序项目中包含“test.h”并尝试编译它时编译失败。我得到的错误是:

C2039: 'string' is not a member of 'std'

标签: c++

解决方案


您的头文件应该始终是自给自足的。将您的库(在本例中<string>)包括在您需要它们的地方、您需要它们的任何地方以及仅在您需要它们的地方。

如果您的标头需要某个库才能运行,请将其包含在该文件中;不要回复已经包含该库的其他标题,因为如果该不同的文件发生更改,那么您就不走运了。

您已经#include通过 保护#pragma once,因此添加#include <string.h>到需要它的头文件不会导致冲突,并且还将使它们更易于维护和解释。


推荐阅读