Неразрешенные внешние объекты в C++ при использовании векторов и поиске

Я попробовал этот код в совершенно отдельном проекте, и он отлично работает (с той лишь разницей, что неработающий проект экспортируется как DLL). Вот код:

RTATMATHLIB.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

Вот и все. Я не уверен, почему это работает в другом проекте, а не в этом...


person MintGrowth    schedule 14.05.2011    source источник
comment
Я предполагаю, что есть проблема времени выполнения отладки. Какие у вас настройки проекта? Любые предупреждения?   -  person Bart    schedule 14.05.2011
comment
@Bart: я новичок в C ++, поэтому я не уверен, какие настройки вы имеете в виду? Заранее извиняюсь за свою неосведомленность. Но предупреждений нет.   -  person MintGrowth    schedule 14.05.2011
comment
убедитесь, что вверху в небольшом раскрывающемся списке указано «Выпустить, а не отладить». Кроме того, если вы просто создаете программы на C++, при создании нового проекта убедитесь, что вы выбрали пузырь с надписью «Пустой проект» в параметрах (я вижу stdafx.h в вашем списке заголовков, который обычно используется в приложениях Windows).   -  person Seth Carnegie    schedule 14.05.2011


Ответы (4)


Я нашел еще одно сообщение на форуме, где кто-то, похоже, сообщил о той же самой проблеме, что и у вас. Пожалуйста, проверьте, есть ли у вас

_DEBUG

определяется либо в настройках вашего проекта (в разделе C/C++ -- препроцессор), либо где-то в вашем коде (или включаемых файлах).

Похоже, что std::vector думает, что вы строите отладочную сборку, хотя на самом деле вы создаете релизную сборку.

Надеюсь, это поможет.

person Lucky Luke    schedule 14.05.2011

Проблема в моем случае заключалась в конфигурации отладки с Runtime Library, установленным на Multi-threaded DLL. Исправление состояло в том, чтобы изменить его на Multi-threaded Debug DLL. Ошибка исчезла. Удаление макроса _DEBUG также было своего рода обходным путем, я думаю, это не очень хорошая идея, потому что вы в конечном итоге получаете отладочную сборку, связанную со стандартной библиотекой без отладки.

person cubuspl42    schedule 20.11.2014
comment
Это решило проблему для меня. Я получал: ошибка LNK2001: неразрешенный внешний символ __imp__CrtDbgReportW. Это было связано с моим переключением с 32-битного на 64-битное в моем приложении Direct3D11. В Visual Studio 2013 Community этот параметр находится в разделе «Свойства проекта» -> «Свойства конфигурации» -> «C/C++» -> «Генерация кода» -> «Библиотека времени выполнения». - person Andrew; 19.05.2015
comment
Я тоже компилировал breakpad с помощью msvc2015 и нуждался в /MD, и это работало для выпуска, но требовалось /MDd для отладки. - person edin-m; 08.10.2016

Проблема была в том, что я определил _DEBUG в C/C++->Preprocessor. Изменение его на NDEBUG решило проблему.

person Yonatan Simson    schedule 21.04.2014
comment
Большое вам спасибо, так много проблем с попыткой заставить это работать, это невероятно... - person MLMLTL; 16.06.2015

Работал для меня с: проблема в моем случае была конфигурацией отладки с библиотекой времени выполнения, установленной на многопоточную DLL. Исправление заключалось в том, чтобы изменить его на многопоточную отладочную DLL.

person Anurag Daware    schedule 03.03.2015