“error LNK2019: 无法解析的外部符号”问题解决方案

本文介绍了在使用VS2013进行编程时遇到的errorLNK2019错误,并提供了详细的解决方案。通过对比.h与.cpp文件的引用方式,解释了引发此错误的原因及如何正确地在不同工程项目间引用类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近用VS2013编程时,出现如下错误:

错误 75 error LNK2019: 无法解析的外部符号 "public: __thiscall CmCurveEx::CmCurveEx(class cv::Mat const &,float)" (??0CmCurveEx@@QAE@ABVMat@cv@@M@Z),该符号在函数 "public: bool __thiscall CaptureToyContourPixel::CaptureGLBufferToBMPOf24BitsInAnyLarge(char *,int,int,int,int)" (?CaptureGLBufferToBMPOf24BitsInAnyLarge@CaptureToyContourPixel@@QAE_NPADHHHH@Z) 中被引用 C:\Users\liulimingl\Desktop\EasyToy4.24\DrawDll\CaptureToyContourPixel.obj DrawDll

然后各种查阅,有说是找不到附加依赖项的,提出这样解决:

project-属性--link--输入--依赖库: 添加相应的库文件.lib

实验后,发现仍然不正确,最后在一篇博客中找到解决方法如下:

有一个解决方案,有两个工程A,B。工程B中定义了一个类,在工程A的demo.cpp中引用该类,但是如果是

#include "XX,h",则会出现“error LNK2019: 无法解析的外部符号”

如果是#include "XX.cpp",则可以顺利编译通过。

想来是因为引用 .h 文件导致找不到.cpp中的定义,而引用.cpp可以通过.cpp找到.h(.cpp有对.h的include)

但是如果同在工程B下面,则#include "XX,h"也是正确的,它会自动关联到同名的(反正是对应的).cpp文件。

在不同工程中应该如何引用呢?

看见一种原因分析,如下:

现场情况:

funcname 在文件file.cpp/h中定义实现

void funcname(void) {;}

filecall.c文件内呼叫funcname()函数。

出现上面情况。

症因:因c/c++混合编程, c文件内函数无法呼叫c++文件内函数。

解决,或者将c文件名改为.cpp,或者将c++文件名改为.c

上面的解决采用将 file.cpp 更名为file.c即可。

在这里mark一下,转自:http://blog.youkuaiyun.com/friday5pm/article/details/1523859

<think>好的,我现在需要解决用户提到的在Windows PowerShell中使用CMake时出现的LNK2019链接错误。首先,我应该回忆一下LNK2019错误通常是什么原因导致的。根据经验,这种错误通常是由于编译器找不到某个函数或符号的定义,可能的原因包括缺少库文件、链接库的顺序不对、或者代码声明和定义不一致等。 接下来,用户提到了使用CMake和PowerShell,所以可能需要检查CMake的配置是否正确。参考用户提供的引用,尤其是引用[2]和引用[4],里面提到了安装特定版本的VC工具链以及编译步骤。比如,用户引用了安装dlib时需要指定VC2015的工具集,并且生成解决方案时使用了特定的CMake命令。这说明工具链版本不匹配可能导致链接错误。例如,如果项目需要VC2015的工具集,但当前环境使用的是VC2017,就可能导致库不兼容,从而出现LNK2019错误。 另外,引用[3]中的错误信息提到了tensorflow的LogMessage析构函数无法解析,这可能是因为相关的TensorFlow库没有被正确链接,或者编译时使用的库版本与代码不兼容。因此,需要检查项目中是否包含了正确的库路径,并且链接了所有必需的库文件。 接下来,我需要整理解决步骤。首先,确认编译器工具链是否正确。用户可能需要使用特定的生成器(如Visual Studio 2015)来生成项目,如引用[2]中的例子。然后,确保所有依赖库的路径正确,并且在CMakeLists.txt中正确指定。此外,检查代码中是否存在未实现或未包含的虚函数,这可能导致符号未找到的错误。 还要考虑项目配置中的运行时库是否一致,比如MD与MT的配置是否统一。如果某些库使用的是动态链接而另一些是静态链接,可能会导致符号解析失败。此外,清理构建目录并重新生成解决方案可能有助于解决残留的编译问题。 用户可能在执行CMake命令时没有指定正确的生成器或工具集,导致使用了不兼容的编译器版本。例如,在引用[2]中,用户使用了-G "Visual Studio 14 2015 Win64"来指定生成器,这可能解决了工具链的问题。所以,建议用户检查CMake命令是否正确指定了生成器和平台。 最后,可能需要更新或重新安装依赖库,确保它们的版本与项目兼容。如果问题依旧,查看具体的错误日志,定位缺失的符号属于哪个库,然后针对性解决。</think>### 分步解决方案 在Windows PowerShell中使用CMake时出现`LNK2019 unresolved external symbol`错误,通常由以下原因导致: 1. **工具链不兼容** 确保CMake生成器与编译器版本匹配。例如,若项目依赖VC2015工具链,需显式指定生成器: ```powershell cmake .. -G "Visual Studio 14 2015 Win64" -T host=x64 ``` 参考引用[2],工具链版本错误会导致链接库不兼容[^2]。 2. **依赖库未正确链接** - 检查`CMakeLists.txt`中是否包含所有依赖库的路径和名称,例如: ```cmake link_directories("path/to/libs") target_link_libraries(your_target PRIVATE required_lib1 required_lib2) ``` - 若使用第三方库(如TensorFlow),确认其编译环境与当前项目一致,避免混合不同运行时库(如`MD`与`MT`)[^3]。 3. **代码声明与实现不一致** 检查报错的符号(如`LogMessage::~LogMessage`)是否在头文件中声明但未实现,或虚函数未覆盖。 4. **清理并重新构建** 删除`build`目录后重新生成解决方案: ```powershell Remove-Item -Recurse -Force build mkdir build cd build cmake .. [指定生成器参数] cmake --build . ``` 引用[4]表明,残留编译文件可能导致意外错误[^4]。 5. **验证Windows SDK和工具集** 安装项目要求的SDK版本(如Windows 10 SDK 10.0.14393),并在Visual Studio Installer中确认工具集(如v141或v140)已安装。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值