1

我有一个 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");但是,在调用Logging<TARGET_DEBUG>::set_log_file(someFilePath.c_str());使用该 DLL 的可执行文件之后,我希望 /like/ 能够在 DLL 中使用。最初,它不起作用,因为我没有使用__declspec(dllexport). 但是,当我将适当的宏添加到日志记录类定义(仅限标头)时,我会收到一系列错误消息:

警告 C4273: 'sOstream' : 不一致的 dll 链接 // 为什么指针会出现这种情况?

错误 C2491:“Logging::sOstream”:不允许定义 dllimport 静态数据成员

应用程序中的各种其他类都可以毫无问题地导出/导入,但这是我试图在二进制文件之间共享的唯一模板化类。这不是我过于熟悉的领域:我怎样才能根据需要进行这项工作?请注意,EXE 包括带有 的 Logging 结构,带有带有__declspec(dllimport)的 DLL__declspec(dllexport)

4

1 回答 1

3

您需要将显式模板实例化与__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);
    }
};

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

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

//  explicit template instantiation
template struct Logging<TARGET_DEBUG>;
于 2013-07-08T22:47:39.933 回答