gpt4 book ai didi

c++ - 如何在 VC10 中跨 DLL 边界使用具有静态数据成员的模板化类

转载 作者:行者123 更新时间:2023-11-30 02:53:56 28 4
gpt4 key购买 nike

我有一个 Logging 类,它可以简化为:

template <int TARGET>
struct Logging
{
static ostream * sOstream;
static void log(const char * _txt);
static void set_log_file(const char * _file_name)
{
sOstream = new ofstream(_file_name);
}
}

整个事情在一个二进制文件中运行良好。但是,我/喜欢/能够使用 Logging<TARGET_DEBUG>::log("some message");在 DLL 中,在调用 Logging<TARGET_DEBUG>::set_log_file(someFilePath.c_str()); 之后在使用该 DLL 的可执行文件中。最初,它没有用,因为我没有使用 __declspec(dllexport) 导出类.但是,当我将适当的宏添加到日志记录类定义(仅 header )时,我收到了一系列错误消息:

warning C4273: 'sOstream' : inconsistent dll linkage // why does this occur for a pointer?

error C2491: 'Logging::sOstream' : definition of dllimport static data member not allowed

应用程序中的其他各种类都可以毫无问题地导出/导入,但这是我尝试在二进制文件之间共享的唯一模板化类。这不是我过于熟悉的领域,所以:我怎样才能按要求完成这项工作?请注意,EXE 包含带 __declspec(dllimport) 的日志记录结构, 带有 __declspec(dllexport) 的 DLL

最佳答案

您需要将显式模板实例化与 __declspec 修饰符结合使用。这将导致从 DLL 中生成模板成员。它还将告诉访问模板成员的应用程序应该导入而不是生成它们。

下面的代码进入您的 DLL 项目的头文件

// Normal __declspec import/export stuff
// Define EXPORT_LOGGING in the preprocessor settings of your DLL project

#ifdef EXPORT_LOGGING
#define LOG_EXPORT __declspec(dllexport)
#else
#define LOG_EXPORT __declspec(dllimport)
#endif

template <int TARGET>
struct LOG_EXPORT Logging
{
static std::ostream * sOstream;
static void log(const char * _txt)
{
// ... logging code ...
}
static void set_log_file(const char * _file_name)
{
sOstream = new std::ofstream(_file_name);
}
};

下面的代码进入您的 DLL 项目中的 .cpp 文件

// static member for TARGET_DEBUG
std::ostream* Logging<TARGET_DEBUG>::sOstream = nullptr;

// explicit template instantiation
template struct Logging<TARGET_DEBUG>;

关于c++ - 如何在 VC10 中跨 DLL 边界使用具有静态数据成员的模板化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17537033/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com