C++ 项目作为静态库编译,作为动态库失败(链接器错误)。为什么?

标签 c++ dll visual-studio-2008-sp1 log4cplus

我有一个 VS2008 native C++ 项目,我希望将其编译为 DLL。

它只引用一个外部库(log4cplus.lib),并使用它的功能。 (当然也使用 log4cplus 的 .h 文件)。

当我尝试将我的项目编译为静态库时,它成功了。 当我尝试作为 DLL 时,它失败了:

1>MessageWriter.obj : error LNK2019: unresolved external symbol "public: static class log4cplus::Logger __cdecl log4cplus::Logger::getInstance(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (?getInstance@Logger@log4cplus@@SA?AV12@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z) referenced in function "class log4cplus::Logger __cdecl Log(void)" (?Log@@YA?AVLogger@log4cplus@@XZ)

还有 4 个与 log4cplus.lib 中的函数相关的错误。

这看起来真的很愚蠢.. 请帮助我 :)

谢谢!

编辑:

我链接到 log4cplus.lib 文件,它发现它很好。 此外,log4cplus.lib 是 100% 的功能,我在另一个项目中使用它没有问题。 我的初衷是将我的项目编译为静态库并在我正在编写的另一个 DLL 中使用它,但是当这样做时,我在另一个项目中遇到了相同的链接器错误...

编辑#2:

导致链接器错误的函数是静态函数。这可能是问题的一部分吗?

最佳答案

wilx 是对的。我有同样的链接问题。

我花了将近一天的时间来解决这个问题。

我已经下载了log4cplus-1.0.4,用visual studio 2010打开这个项目后编译,静态库和动态库都没有报错。

但是,当我尝试使用这些库时,无论是静态库还是动态库,我都遇到了链接错误。

原因是,默认情况下,那些项目使用多字节字符,而我自己的项目使用unicode,所以,为了解决这些链接问题,你只需要改变一个项目的字符集。

都是 unicode 或都是多字节字符集。

并在 visual studio 2010 中更改一个项目的字符集, 请参阅以下链接。

How do I turn off Unicode in a VC++ project?

关于C++ 项目作为静态库编译,作为动态库失败(链接器错误)。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2848556/

相关文章:

c++ - 关键字 "and"、 "or"和 "not"未定义

WCF 测试客户端显示 IMetadataExchange

c++ - 在全屏模式游戏中运行exe文件

c++ - DLL 中 C 风格函数中的静态变量

c++ - 无法从 GetSystemTime() 获取毫秒数

c# - 从 Java 应用程序调用 C# dll

visual-c++ - Visual C++ 发布版本 - 字符串在跨 DLL 传递时是否会因为使用不同的运行时版本编译而损坏?

c++ - c/c++ 指针的内存地址保存在哪里?

C++ : how to make sure all variables are initialized?

c++ - 将值乘以 static_cast<uint8_t> 时如何确定 auto 的类型