【发布时间】:2011-01-15 21:39:41
【问题描述】:
我正在努力让 rLog 在 Windows 下构建为 DLL,但我遇到了与 rlog 命名空间中的一些全局符号相关的未定义符号错误。特别是 RLogChannel.cpp 中的这些:
namespace rlog {
...
RLogChannel *_RLDebugChannel = GetGlobalChannel( "debug", Log_Debug );
RLogChannel *_RLInfoChannel = GetGlobalChannel( "info", Log_Info );
RLogChannel *_RLWarningChannel = GetGlobalChannel( "warning", Log_Warning );
RLogChannel *_RLErrorChannel = GetGlobalChannel( "error", Log_Error );
...
};
我认为问题在于 1) 它们没有被导出,2) 它们没有在标头中声明,因此其他东西可以访问它们。所以我向它们添加了一个 __declspec(dllexport) (通过 RLOG_DECL 宏),并在标题中输入:
namespace rlog {
...
RLOG_DECL extern RLogChannel *_RLDebugChannel;
RLOG_DECL extern RLogChannel *_RLInfoChannel;
RLOG_DECL extern RLogChannel *_RLWarningChannel;
RLOG_DECL extern RLogChannel *_RLErrorChannel;
...
};
但是,无论我如何在 RLogChannel.cpp 中声明变量,我都会收到重新定义错误,尽管我在标头中将它们外部化了......这样做的正确方法是什么?似乎它应该很简单,但我无法完全理解它。
编辑:错误信息
Error 12 error C2086: 'rlog::RLogChannel *rlog::_RLDebugChannel' : redefinition rlog-1.4\rlog\RLogChannel.cpp 45 rlog
(所有 4 个符号都相同)
编辑:我不知道发生了什么,之前的代码完全一样,但现在它会编译(感觉就像 MSVC 怪异......),不幸的是,链接到我的库时符号仍然显示为未解析
【问题讨论】:
-
确切的错误信息是什么?
-
在上面更新,所以它的格式比我在这里发布的要好一些。
-
似乎有些重要的事情被忽略了。您能否提供一个简明完整的测试用例(例如,我可以按原样传递给编译器的一个文件)给出此错误?
-
关于您的最后一次编辑:它有助于重建所有内容,因为有时旧文件会缓存在 MSVC 中。您将 RLOG_DECL 翻转为指定导入而不是在链接到您的 DLL 的代码中导出,对吗?
标签: c++ dll namespaces extern