Ошибки C ++ LNK2028, LNK2019 и LNK1120. Что они имеют в виду и как их решить? - PullRequest
0 голосов
/ 15 апреля 2011

Я получаю эти три ошибки, и они, кажется, имеют мало смысла для меня. Если я комментирую UserInstruction1 (P1, P2, P3); в консольном приложении ошибки исчезают. Оба проекта являются проектами / CLR.

error LNK2028: unresolved token (0A000930) "void __cdecl UserInstruction1(double *,wchar_t *,wchar_t *)" (?UserInstruction1@@$$FYAXPANPA_W1@Z) referenced in function "int __cdecl wmain(int,wchar_t * * const)" (?wmain@@$$HYAHHQAPA_W@Z)  

error LNK2019: unresolved external symbol "void __cdecl UserInstruction1(double *,wchar_t *,wchar_t *)" (?UserInstruction1@@$$FYAXPANPA_W1@Z) referenced in function "int __cdecl wmain(int,wchar_t * * const)" (?wmain@@$$HYAHHQAPA_W@Z)

error LNK1120: 2 unresolved externals   C:\Workspace\Company.Pins\Bank\Source\Debug\Company.Pins.Bank.Win32Console.exe

//Console App.
#include "stdafx.h"
#include "UInstruction.h"



int _tmain(int argc, _TCHAR* argv[])
{
    auto P2 = (TCHAR *)"3 Barrowstead";
    TCHAR* P3;
    double* P1;
    P1[0] = 13;

    UserInstruction1(P1, P2, P3);
    return 0;
}

-

//UInstruction.h
#ifndef __UINSTRUCTION_H__
#include "stdafx.h"
#include "UInstruction.h"
#include "common.h"

#include <iostream>
#include <stdio.h>
#define PRES_NOCOMMAND_FOUND 2000


#define DllExport  __declspec(dllexport)

void ReconcileUHParameter(const double* lpNumeric, TCHAR* lpAlpha1, TCHAR* lpAlpha2);
extern void UserInstruction1(double* lpNumeric,     TCHAR* lpAlpha1, TCHAR* lpAlpha2);

#endif

-

//UInstruction.cpp
#include "stdafx.h"
#include "UInstruction.h"
#include "common.h"
#using "Company.Pins.Bank.Decryption.dll"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;


CPReSInterfaceApp theApp;
extern void UserInstruction1(
                    double* lpNumeric, 
                    TCHAR* lpAlpha1, TCHAR* lpAlpha2)
{
//logic goes here       
}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Вы пытаетесь использовать функцию в проекте, который скомпилирован с параметром / clr.Управляемый код.Из проекта консольного приложения, скомпилированного без параметра / clr.Родной код.Вы получаете ошибку компоновщика, потому что он ищет функцию __cdecl, он фактически скомпилирован как функция __clrcall.

Это просто проблема компоновщика, также есть проблема времени выполнения, потому что ваше консольное приложение не имеетCLR загружен и инициализирован, готов к выполнению управляемого кода.Вы должны рассмотреть, как вы собираетесь взаимодействовать с управляемым кодом.Очевидное решение - сделать консольное приложение управляемым.Или чтобы сделать вашу DLL неуправляемой, вы не делаете очевидного использования .NET Framework.Или вы можете усложнить свою жизнь, разместив CLR в своем родном приложении (google CorBindToRuntimeEx ()) или превратив свою DLL в COM-сервер.

2 голосов
/ 15 апреля 2011

Я предполагаю, что весь код находится в одном проекте (Company.Pins.Bank.Win32Console).В этом случае вам следует переместить включения <\ iostream> и <\ stdio.h> (и любые другие включения заголовков, которые никогда / редко изменяются на stdafx.h:

//stdafx.h

#include <iostream>
#include <stdio.h>


//other headers that are widely used but never/seldom change...

#define DllExport  __declspec(dllexport)
#define DllImport  __declspec(dllimport)

и

//UInstruction.h

#pragma once //you are in VS 2010...

#include "common.h"

//ommited code for brevity...
void UserInstruction1(double* lpNumeric,     TCHAR* lpAlpha1, TCHAR* lpAlpha2);

и

//UInstruction.cpp
#include "stdafx.h"
#include "UInstruction.h"

//ommitted code for brevity...

void UserInstruction1( double* lpNumeric, 
                       TCHAR* lpAlpha1, TCHAR* lpAlpha2 )
{
   //logic goes here
}

Если UserInstruction1 находится в Dll, который используется проектом Company.Pins.Bank.Win32Console:

Убедитесь, что вы определили в stdafx.h дляdll и консольные проекты:

#define DllExport  __declspec(dllexport)
#define DllImport  __declspec(dllimport)

Откройте свойства проекта DLL, перейдите в «Свойства конфигурации» -> «C / C ++» -> «Препроцессор» и добавьте в «Определения препроцессора» символ препроцессора.(если у вас его нет). Т.е. я назову его MY_DLL. Не забудьте определить его во всех конфигурациях ...

Убедитесь, что вы экспортируете функции из Dll

//UInstruction.h

#pragma once //you are in VS 2010...

#ifdef MY_DLL
    #define MY_DLL_EXPORTS  DllExport
#else
    #define MY_DLL_EXPORTS  DllImport
#endif //MY_DLL

#include "common.h"

#define PRES_NOCOMMAND_FOUND 2000

//ommited code for brevity...

void MY_DLL_EXPORTS UserInstruction1(double* lpNumeric,     TCHAR* lpAlpha1, TCHAR* lpAlpha2);

Файл cpp для UInstruction остается таким же, как указано выше ...

РЕДАКТИРОВАТЬ: Для полноты ...

//UInstruction.cpp
#include "stdafx.h"
#include "UInstruction.h"

//ommitted code for brevity...

//no extern needed...
void UserInstruction1( double* lpNumeric, 
                       TCHAR* lpAlpha1, TCHAR* lpAlpha2 )
{
   //logic goes here
}

Не забудьте добавить ссылку на Dllпроект для проекта Company.Pins.Bank.Win32Console из свойств Company.Pins.Bank.Win32Консоль «Общие свойства» -> «Фреймворк и ссылки»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...