LNK2019:未解析的外部符号,在不存在的 *.obj 文件中搜索

LNK2019 : unresolved external symbol, searched for in a non-existing *.obj file

早上好,
我刚刚从一位离职的同事那里继承了一份申请,我已经遇到了麻烦:我们所做的最后一件事是将解决方案从 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\usharedmemory.obj" 中(在项目的目录中)引起的,但快速查看后,似乎这个 *.obj 文件根本不存在。
因此下一个问题是:我该怎么做才能确保创建 *.obj 文件?我已经验证 "usharedmemory.cpp" 文件存在于主项目的目录中(相应的 *.h 文件位于 "External Dependencies" 章节中,这让我相信 *.obj 文件将在构建主项目期间创建。
你看我的问题:我的项目引用了项目需要创建的文件,但是由于项目没有创建文件,他显然不能引用它,你看我在运行中的圆圈:-)

(供参考,我不知道如何生成“*.obj”文件)

有人可以帮我吗?
谢谢

编译器在编译时为项目中的每个源文件直接从源文件 (*.cpp) 创建目标文件 (*.obj)。

您收到的错误 not 是由 usharedmemory.obj 不存在引起的;它应该在 DebugRelease 文件夹中创建。

你得到的错误是因为 usharedmemory.cpp 使用了 C_NamedSemaphoreC_NamedSemaphore(char const *,unsigned int)-constructor 而构造函数的定义不能可以在任何源文件中找到。此构造函数用于 usharedmemory.cpp 中定义的 C_RecursiveNamedSemaphore(char const *,unsigned int)-构造函数。这是错误消息的内容。

要解决这个问题,你需要找出C_NamedSemaphore的构造函数在哪里定义(哪个源文件),并确保这个源文件包含在你的项目中。或者,如果它在库文件(静态或动态)中,请验证该库文件是否包含为 Additional Dependency(在 project Properties -> Linker -> Input -> Additional Dependencies 下;确保为 所有 构建,而不仅仅是当前活动的构建)。

早上好,
我终于解决了我的问题。作为一个好公民,我将描述我是如何做到的:-),但作为一个不太好的程序员,我需要承认我不明白我的行为是如何解决问题的;-(
我对两个 *.vcxproj Visual Project 文件(VC2010 的旧文件和 VC2013 的新文件)进行了文件比较。通过这种方式,我看到 "umultiproc.cpp" 条目在 VC2013 中丢失了:
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<ItemGroup>
...
<ClCompile Include="..\..\mp\umultiproc.cpp" /> <!-- missing -->

总结:在错误信息中,有一个未解析的符号(C_Semaphore构造函数),它是在*.cpp/*.hsource/header文件中定义的。为了解决这个错误,我在VC2013工程文件中加入了对*.cpp源文件的引用。