ошибка LNK2010 в Visual C, не может вызвать метод в другом файле проекта - PullRequest
2 голосов
/ 14 февраля 2012

ошибка LNK2019: неразрешенный внешний символ "char * __cdecl BytesToString (unsigned char const *, unsigned int) " (? BytesToString @@ YAPADPBEI @ Z) ссылка в функции _wmain C: \ Users \ anandada \ Documents \ Visual Studio 2010 \ Projects \ ByteToString \ ByteToString \ ByteToString.obj ByteToString

выше - ошибка, которую я получаю. код показан ниже. ByteToString - консольное приложение Win32, а служебная программа - Win32 DLL.

Utility.c

#include "stdafx.h"
#include "Utility.h"
#include "stdlib.h"

char* BytesToString( const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes)
{
    unsigned char bRetVal = 0;
    unsigned int ctr = 0;
    char* PpszString = NULL;
    int len=0;

    do
    {
        PpszString=(char*)calloc(PuiNoOfBytes*3+1,sizeof(char));
        if(NULL==PpszString)
            break;
        len=5;
    } while(0);
    return PpszString;
}

Utility.h

#ifndef _UTILITY_H
#define _UTILITY_H
__declspec(dllexport) char* BytesToString( const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes);
#endif

ByteToString.cpp

// ByteToString.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "string.h"
#include "stdlib.h"
#include "..\Utility\Utility.h"

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char pbArray[5]={0x41,0x42,0x43,0x44,0x45};
    char* pbExpArray=NULL;
    unsigned int Flag=1;
    int len=0;

    pbExpArray=BytesToString(pbArray,5);
    free(pbExpArray);
    Flag=strcmp("41 42 43 44 45 ",pbExpArray);
    len=strlen(pbExpArray);

    return 0;
}

Я установил свойства проекта следующим образом:

Соглашения о вызовах между проектами ByteToString и Utility: __cdecl

В ByteToString, Linker-> General-> Дополнительные каталоги: $ (OutDir)

(я тоже пробовал Linker-> General-> Дополнительные каталоги: $ (SolutionDir) $ (Configuration) \)

В ByteToString, Linker-> Input-> Дополнительные зависимости: Utility.lib

Я тоже это пробовал,

#ifndef _UTILITY_H
#define _UTILITY_H
extern "C"
{
__declspec(dllexport) char* BytesToString( const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes);
}
#endif

Это дает ошибку:

ошибка C2059: синтаксическая ошибка: 'строка'

Обновление:

  1. При создании проекта я добавил Utility.cpp . Я переименовал его в Utility.c , установил свойства проекта и скомпилировал. Я получил ошибку, показанную выше.
  2. Затем я переименовал его обратно в Utility.cpp и скомпилировал. Нет ошибок.

Почему это? Я хочу Utility файл в .c . Как правильно добавить файл .c в проект?

Ответы [ 4 ]

2 голосов
/ 14 февраля 2012

Объявляем внешнее с внешним "C" вместо.

1 голос
/ 14 февраля 2012

Вам нужен заголовочный файл, чтобы различать использование в экспортируемой DLL и другой потребляющий модуль (DLL или EXE). Мастер проекта сгенерировал определение препроцессора для этой цели. Если ваша экспортируемая DLL называется Utility.dll, тогда это определение UTILITY_EXPORTS. Проверьте свойства своих проектов для этого.

В вашем заголовочном файле вы определяете что-то вроде этого

#ifdef UTILITY_EXPORTS
#define UTILITY_API __declspec(dllexport)
#else
#define UTILITY_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif 

UTILITY_API char* BytesToString( const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes);

#ifdef __cplusplus
}
#endif

Это заставляет проект-потребитель использовать символ в библиотеке импорта, который вы добавили в модуль-потребитель.

0 голосов
/ 15 февраля 2012

Вам необходимо добавить __declspec(dllexport), в то время как реализует функцию:

__declspec(dllexport)
char* BytesToString( const unsigned char* PpcbBytes, const unsigned int PuiNoOfBytes) 
{ }

И убедитесь, что в вашем целевом проекте установлена ​​правильная LIB!

0 голосов
/ 14 февраля 2012

Я думаю, что вы не добавили .lib файл другого проекта в ваш проект. Вот почему компоновщик говорит, что не может найти функцию. Тот факт, что на вашем жестком диске лежит другой проект, не означает, что компоновщик знает, где найти вашу функцию. Он только смотрит на код, скомпилированный в текущем проекте. Если у вас есть DLL, вы либо загружаете функцию с помощью LoadLibrary, а затем GetProcAddress, либо добавляете сопроводительный файл .lib в свой проект.

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