LNK2001 неразрешенный внешний при импорте функций из MFC DLL - PullRequest
1 голос
/ 04 октября 2011

Я создал MFC DLL и экспортировал функции, например, в файл SerialPort.h:

class CSerialPortApp : public CWinApp
{
public:
    CSerialPortApp();

    __declspec(dllexport) int SWrite(unsigned char* toSend, int len);
};

и в моем приложении MFC я хочу вызвать функцию в SerialInterface.h Я включил «SerialPort.h» из DLL и вызвал:

__declspec(dllimport) int SWrite(unsigned char* toSend, int len);

class SerialInterface
{
public:

};

например.

Я добавил файл SerialPort.lib в мой компоновщик, но когда я пытаюсь скомпилировать, я получаю

error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl SWrite(unsigned char*, int)" (__imp_?SWrite@@YAHPAEH@Z)

Я застрял в причине этого, я пытался восстановить все, но ничего не помогает?

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Вы используете __declspec (dllexport) внутри класса?

Вы экспортируете глобальные функции из dll или целого класса, который может содержать любые функции.Вам не нужно экспортировать выбранные функции-члены из класса, я даже не знаю, как это работает.

Немного странно, что вы неправильно экспортируете класс SerialPort из dll (согласно вашейкод), но вы можете использовать его в своем приложении и вызывать его функцию-член !?Я немного смущен.

0 голосов
/ 05 октября 2011

Ну, я нашел альтернативу, которая работает, я думаю, что я неправильно ее реализовывал.

Я добавил в свою библиотеку новый класс, который не был классом CWinApp:

class SerialPort
{
public:
    __declspec(dllexport) SerialPort(void);
    __declspec(dllexport) virtual ~SerialPort(void);

    __declspec(dllexport) int SWrite(unsigned char* toSend, int len);
};

затем включил заголовок для этого в моем приложении и в lib и dll и т. Д.

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

#include "SerialPort.h"

class CPPUDlg : public CDialog
{
public:
    CPPUDlg(CWnd* pParent = NULL); // standard constructor

    SerialPort objSerialPort;

и затем в своем коде я просто называю

objSerialPort.SWrite(toSend, len);

Я не использовал dllimport для импорта функций, которые, как я предполагал, мне понадобятся, но теперь он работает!

Надеюсь, это поможет любому, у кого может быть похожая проблема.

...