LNK2019:未解析的外部符号,在不存在的 *.obj 文件中搜索
Posted
技术标签:
【中文标题】LNK2019:未解析的外部符号,在不存在的 *.obj 文件中搜索【英文标题】:LNK2019 : unresolved external symbol, searched for in a non-existing *.obj file 【发布时间】:2015-09-16 09:47:50 【问题描述】:早上好,
我刚刚从一位离职的同事那里继承了一个应用程序,我已经遇到了麻烦:我们做的最后一件事是将解决方案从 Visual Studio 2010 移植到 2013。
现在,在构建解决方案中的一个项目时,我收到以下错误消息:1>usharedmemory.obj : error LNK2019: unresolved external symbol "public: __cdecl C_NamedSemaphore::C_NamedSemaphore(char const *,unsigned int)" (??0C_NamedSemaphore@@QEAA@PEBDI@Z) referenced in function "public: __cdecl C_RecursiveNamedSemaphore::C_RecursiveNamedSemaphore(char const *,unsigned int)" (??0C_RecursiveNamedSemaphore@@QEAA@PEBDI@Z)
这个错误似乎是由文件“Y:\Ucam5\ucm\x\rip_mlfdpf\ussharedmemory.obj”(在项目目录中)引起的,但快速查看后,似乎这个*.obj文件甚至没有存在。
因此下一个问题是:我可以做些什么来确保 *.obj 文件被创建?我已经验证了“ussharedmemory.cpp”文件存在于主项目的目录中(对应的*.h文件位于“外部依赖”一章,这让我相信*.obj文件将是在主项目的构建过程中创建。
你看我的问题:我的项目引用了项目需要创建的文件,但是由于项目没有创建文件,他显然不能引用它,你看我运行的圈子:-)
(仅供参考,我不知道如何生成“*.obj”文件)
谁能帮帮我? 谢谢
【问题讨论】:
可能是项目依赖排序错误。正在寻找.obj
文件的项目正在构建之前 将生成.obj
文件的项目。因此,错误。
【参考方案1】:
目标文件 (*.obj
) 是编译器在编译时直接从源文件 (*.cpp
) 为项目中的每个源文件创建的。
您收到的错误不是由 ussharedmemory.obj 不存在引起的;它应该在 Debug 或 Release 文件夹中创建。
你得到的错误是因为 ussharedmemory.cpp 使用了C_NamedSemaphore
的C_NamedSemaphore(char const *,unsigned int)
-constructor 并且在任何源文件中都找不到构造函数的定义。此构造函数用于 ussharedmemory.cpp 中定义的 C_RecursiveNamedSemaphore(char const *,unsigned int)
-constructor。这就是错误消息的内容。
要解决这个问题,你需要找出C_NamedSemaphore
的构造函数定义在哪里(哪个源文件),并确保这个源文件包含在你的项目中。或者,如果它位于库文件(静态或动态)中,请验证该库文件是否包含为 附加依赖项(在 project Properties -> Linker -> Input -> Additional Dependencies
下;确保为 all 构建,而不仅仅是当前活跃的构建)。
【讨论】:
【参考方案2】:早上好,
我终于解决了我的问题。作为一个好公民,我会描述我是如何做到的 :-),但作为一个不太好的程序员,我需要承认我不明白我的行为是如何解决问题的 ;-(
我对两个 *.vcxproj Visual Project 文件(VC2010 的旧文件和 VC2013 的新文件)进行了文件比较。这样,我看到 VC2013 中缺少“umultiproc.cpp”条目:<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<ItemGroup>
...
@987654325 @
总结:在错误消息中,有一个未解析的符号(C_Semaphore 构造函数),它在 *.cpp/*.h 源/头文件中定义。为了解决错误,我在VC2013工程文件中添加了对*.cpp源文件的引用。
【讨论】:
以上是关于LNK2019:未解析的外部符号,在不存在的 *.obj 文件中搜索的主要内容,如果未能解决你的问题,请参考以下文章
vc ++ MFC应用程序,错误LNK2019:未解析的外部符号
C++ LNK1120 和 LNK2019 错误:“未解析的外部符号 WinMain@16”