C++:使用来自另一个项目的函数

Posted

技术标签:

【中文标题】C++:使用来自另一个项目的函数【英文标题】:C++ : Using functions from another project 【发布时间】:2014-03-28 02:37:46 【问题描述】:

我在 Visual Studio 中遇到链接错误。有两个项目。一个是静态库,另一个是可执行文件。我已经指出了 .exe 项目属性,以便它知道在哪里可以找到 .lib 文件和库目录。不太清楚为什么它仍然无法检测到我正在尝试使用的那个项目的功能。我还检查了确保函数签名匹配并且已实现。

我可以尝试任何其他建议吗? 另外,设置项目依赖项到底有什么作用?我已经尝试将 .exe 项目设置为依赖于静态库项目,但没有任何改变。

1>------ Build started: Project: TestAgent, Configuration: Debug Win32 ------
1>     Creating library Win32\Debug\TestAgent.lib and object Win32\Debug\TestAgent.exp
1>Registrar.obj : error LNK2019: unresolved external symbol "public: long __thiscall StudentManager::Register(class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &)" (?Register@StudentManager@@QAEJABV?$CStringT@GV?$StrTraitMFC@GV?$ChTraitsCRT@G@ATL@@@@@ATL@@00000@Z) referenced in function "public: void __thiscall Registrar::PopulateClasses(struct HWND__ *)" (?PopulateClasses@Registrar@@QAEXPAUHWND__@@@Z)
1>TestCase1.obj : error LNK2001: unresolved external symbol "public: long __thiscall StudentManager::Register(class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &)" (?Register@StudentManager@@QAEJABV?$CStringT@GV?$StrTraitMFC@GV?$ChTraitsCRT@G@ATL@@@@@ATL@@00000@Z)
1>Registrar.obj : error LNK2019: unresolved external symbol "public: long __thiscall SectionManager::Register(class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &)" (?Register@SectionManager@@QAEJABV?$CStringT@GV?$StrTraitMFC@GV?$ChTraitsCRT@G@ATL@@@@@ATL@@000000@Z) referenced in function "public: void __thiscall Registrar::PopulateClasses(struct HWND__ *)" (?PopulateClasses@Registrar@@QAEXPAUHWND__@@@Z)
1>TestCase1.obj : error LNK2001: unresolved external symbol "public: long __thiscall SectionManager::Register(class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &,class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > const &)" (?Register@SectionManager@@QAEJABV?$CStringT@GV?$StrTraitMFC@GV?$ChTraitsCRT@G@ATL@@@@@ATL@@000000@Z)
1>TeacherSectionManager.obj : error LNK2001: unresolved external symbol "private: static class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > Registration::m_strServiceBaseUrl" (?m_strServiceBaseUrl@Registration@@0V?$CStringT@GV?$StrTraitMFC@GV?$ChTraitsCRT@G@ATL@@@@@ATL@@A)
1>Win32\Debug\TestAgent.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

【问题讨论】:

另外,设置项目依赖项到底有什么作用? 它只是设置您的项目构建顺序。如果项目 A 依赖于项目 B,则项目 B 将始终先构建。 将两个项目放在同一个解决方案文件中,然后通过转到可执行项目的属性页 -> 通用属性 -> 添加新引用,将静态库引用添加到可执行项目的属性。 或者确保您的项目设置为“链接依赖库”。我这样做了,当前依赖的任何项目都会产生 .lib 输出(通过 DLL 导入库或静态库)将为您自动链接依赖项。 【参考方案1】:

请参阅this blog post 以获得良好的概述。 它所做的比仅仅让它首先被构建更强大。它还知道它把库放在哪里,所以你不必用硬编码的地方来填充你的库路径列表,当每个配置的路径不同时,这尤其令人讨厌。

确保您所说的“设置为依赖”是指新的项目到项目引用,而不是解决方案级别的构建顺序/构建依赖关系对话框。

您可以在链接中打开详细输出,以查看实际解析了哪些输入。在这种情况下,查看记录的命令行就足够了。如果这表明包含了所需的库,则可能是编译器选项影响名称修改,或者有时是邪恶的 #define 宏会在您不知情的情况下更改符号的实际名称。

【讨论】:

以上是关于C++:使用来自另一个项目的函数的主要内容,如果未能解决你的问题,请参考以下文章

从另一个指针指向函数的指针

在 C++ 中包含来自单独文件夹的文件

C++ / VS 2012 - 多项目解决方案:一个项目中的链接器错误但另一个项目中没有

使用 C++ 项目 (Visual Studio) 中的参数调用 Python 函数

链接来自另一个文件的函数时,Qt 上出现错误 LNK 2019 [重复]

如何从 C 代码正确创建 DLL 并在 C++ 项目中使用它