将静态库链接到动态链接库(DLL)

4
我正在使用 Visual Studio 5.0。 我有一个 DLL 和一个静态库。我的意图是使用在静态库中定义的静态函数。我已经在预定的源 cpp 文件中包含了头文件,并在项目依赖项中给出了路径,但仍然出现链接器错误。
以下是链接器错误:
错误 LNK2019:未解析的外部符号 "public: static bool __cdecl gph::IsA(class PtOnDemand &,wchar_t const *)" (?IsA@gph@@SA_NAAVPtOnDemand@@PB_W@Z) 在函数 "private: int __thiscall PtXMLP::HandleObjectBegin(char const *,char const * *)" (?HandleObjectBegin@PtXMLP@@AAEHPBDPAPBD@Z) 中引用 1>.\ReleaseU/epptxml.dll : 致命错误 LNK1120: 1 个无法解析的外部
有什么建议吗?

2
你应该向我们展示Makefile/项目文件和链接器错误。此外,所有回答更新你的Visual Studio版本都会得到+1...天哪,5.0太古老了。 - Tim
4个回答

3

可能是由于编译设置不同,例如release和debug、unicode和非unicode、调用约定不同,导致链接器找不到您的函数。这可能会导致名称被不同地混合。如果.h文件是用c而不是c++编写的,则可能需要通过将原型包装在

中来完全禁用名称混淆。

  extern "C" 
   {
     // function prototypes go here.
   }

1
根据Sameer对其他答案的评论,几乎可以确定这是正确的。 - David Gladfelter
+1,如上所述,给定的函数需要一个表示Unicode的wchar_t。此外,IsA听起来像是MFC中常见的IsKindOf类型函数(例如RTTI替代品)。 - SmacL
我在我的win32应用程序中使用cpprestsdk。它一直在寻找库(cpprestsdk)的dll。这个解决方案对我根本没有用 :( - Marss

2

为了使库文件被链接到项目中,您还需要将其包含在项目中。在VS6中,可以通过选择“项目”->“添加到项目”->“文件”来实现。或者,您也可以在项目属性的链接器选项中进行包含。


@Sameer,听起来你应该调查一下jdv的答案。看看添加_MBCS和UNICODE作为预处理器定义的效果。 - SmacL

1

嗯,我不太清楚Visual Studio 5的情况。但是你需要将想要静态链接的库作为附加依赖项添加到你的项目中。


0

首先,是时候获取新版本的Visual Studio了 :-) 但很可能您正在使用它来支持旧版。

无论如何,仅包含头文件是不够的。您还需要确保告诉链接器静态库文件在哪里(可能是.a文件),以及库的名称是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接