使用 vectors 和 find 时 C++ 中未解析的外部变量

Unresolved externals in C++ when using vectors and find

提问人:LunchMarble 提问时间:5/15/2011 更新时间:3/11/2015 访问量:24193

问:

我已经在一个完全独立的项目中尝试了这段代码,它工作正常(唯一的区别是不起作用的项目被导出为 DLL)。代码如下:

RTATMATHLIB 中。CPP(英语:CPP)

#include "stdafx.h"
#include "RTATMATHLIB.h"
#include <math.h>
#include <vector>
#include <algorithm>
#include <stdexcept>

using namespace std;

double someFunc(double** Y, int length)
{
    vector<double> myVector;

    for(int i = 0; i < length; i++)
    {
        double value = (*Y)[i];

        vector<double>::iterator it = find(myVector.begin(), myVector.end(), value);

        if(it != myVector.end())
        {
            continue;
        }
        else
        {
            myVector.push_back(value);
        }
    }
    return 0;
}

RTATMATHLIB 中。H

__declspec(dllexport) double someFunc(double** Y, int length);

错误

Error   1   error LNK2019: unresolved external symbol __imp___CrtDbgReportW referenced in function "public: __thiscall std::_Vector_const_iterator<double,class std::allocator<double> >::_Vector_const_iterator<double,class std::allocator<double> >(double *,class std::_Container_base_secure const *)" (??0?$_Vector_const_iterator@NV?$allocator@N@std@@@std@@QAE@PANPBV_Container_base_secure@1@@Z)  RTATMATHLIB.obj RTATMATHLIB
Error   2   fatal error LNK1120: 1 unresolved externals

就是这样。我不确定为什么它在另一个项目中起作用,而不是这个......

C++ 查找 stdvector unresolved-external

评论

0赞 Bart 5/15/2011
我猜有一个调试运行时问题。您的项目设置是什么?有什么警告吗?
1赞 LunchMarble 5/15/2011
@Bart:我对C++很陌生,所以我不确定你指的是哪些设置?我提前为我的无知道歉。但是没有警告。
0赞 Seth Carnegie 5/15/2011
确保顶部的小下拉列表显示“发布”而不是“调试”。此外,如果您只是在制作 C++ 程序,当您创建新项目时,请确保在选项中选择显示“空项目”的气泡(我在标头列表中看到 stdafx.h,通常用于 Windows 应用程序)。

答:

36赞 Lucky Luke 5/15/2011 #1

我发现了另一个论坛帖子,其中似乎有人报告了与您遇到的完全相同的问题。请检查您是否有

_DEBUG

在项目设置中定义(在 C/C++ -- 预处理器下)或代码中的某个位置(或包含文件)。

看起来 std::vector 认为您正在构建调试版本,而实际上您正在创建发布版本。

我希望这会有所帮助。

3赞 Yonatan Simson 4/21/2014 #2

问题是我在 C/C++->Preprocessor 中定义了_DEBUG。将其更改为 NDEBUG 解决了该问题。

评论

1赞 MLMLTL 6/16/2015
非常感谢你,试图让它工作起来的很多问题令人难以置信......
28赞 cubuspl42 11/21/2014 #3

就我而言,问题是设置为 的 Debug 配置。解决方法是将其更改为 .错误消失了。删除宏也是一种解决方法,我想这不是一个好主意,因为您最终会得到链接到非调试标准库的调试版本。Runtime LibraryMulti-threaded DLLMulti-threaded Debug DLL_DEBUG

评论

1赞 Andrew 5/20/2015
这为我解决了这个问题。我得到:“错误LNK2001:未解析的外部符号__imp__CrtDbgReportW”。这与我在 Direct3D11 应用程序中从 32 位切换到 64 位有关。在 Visual Studio 2013 Community 中,此设置位于“项目属性”-“>配置属性”-“> C/C++”-“>代码生成”-“>运行时库”下。
0赞 edin-m 10/9/2016
我也是,我正在使用 msvc2015 编译中断板并且需要 /MD,它适用于发布,但需要 /MDd 进行调试
2赞 Anurag Daware 3/3/2015 #4

为我工作: 就我而言,问题是将运行时库设置为多线程 DLL 的调试配置。解决方法是将其更改为多线程调试 DLL