Неразрешенные внешние символы в С++ при использовании векторов и поиск
Я пробовал этот код в полностью отдельном проекте, и он отлично работает (с той лишь разницей, что проект, который не работает, экспортируется как 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 *)" ([email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@@Z) RTATMATHLIB.obj RTATMATHLIB
Error 2 fatal error LNK1120: 1 unresolved externals
И что это. Я не уверен, почему он работает в другом проекте, а не в этом...
Ответы
Ответ 1
Я нашел еще один форум, где кто-то, похоже, сообщил о той же самой точной проблеме, что у вас есть. Пожалуйста, проверьте, есть ли у вас
_DEBUG
определяется либо в ваших настройках проекта (в разделе C/С++ - Preprocessor), либо где-то в вашем коде (или включать файлы).
Похоже, что std::vector думает, что вы строите сборку отладки, когда вы на самом деле создаете сборку выпуска.
Надеюсь, это поможет.
Ответ 2
В моем случае проблема заключалась в конфигурации Debug с Runtime Library
, установленной на Multi-threaded DLL
. Исправить было изменение его на Multi-threaded Debug DLL
. Ошибка исчезла. Удаление макроса _DEBUG
также было своего рода обходным путем, я полагаю, что это не очень хорошая идея, потому что в итоге вы создаете сборку отладки, связанную с не-отладочной стандартной библиотекой.
Ответ 3
Проблема заключалась в определении _DEBUG в C/С++ → Preprocessor. Изменение его в NDEBUG решило проблему.
Ответ 4
Работал для меня:
В моем случае проблема заключалась в настройке Debug с Runtime Library, установленной в многопоточную DLL. Исправление заключается в том, чтобы изменить его на многопоточную Debug DLL