c ++ экспорт и использование функции dll - PullRequest
2 голосов
/ 15 апреля 2011

Я не могу понять, где есть ошибка.Я создаю DLL, а затем использую ее в консольной программе C ++ (Windows 7, VS2008).Но я получаю LNK2019 unresolved external symbol при попытке использовать функции DLL.

Сначала экспорт:

#ifndef __MyFuncWin32Header_h
#define __MyFuncWin32Header_h

#ifdef MyFuncLib_EXPORTS
#  define MyFuncLib_EXPORT __declspec(dllexport)
# else
#  define MyFuncLib_EXPORT __declspec(dllimport)
# endif  

#endif

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

#ifndef __cfd_MyFuncLibInterface_h__
#define __cfd_MyFuncLibInterface_h__

#include "MyFuncWin32Header.h"

#include ... //some other imports here

class  MyFuncLib_EXPORT MyFuncLibInterface {

public:

MyFuncLibInterface();
~MyFuncLibInterface();

void myFunc(std::string param);

};

#endif

Затем в консольной программе есть dllimport, в который включена DLL-библиотека в каталогах компоновщика-> Общие-> Дополнительные библиотеки:

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


__declspec( dllimport ) void myFunc(std::string param);


int main(int argc, const char* argv[])
{
    std::string inputPar = "bla";
    myFunc(inputPar); //this line produces the linker error
}

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

Ответы [ 2 ]

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

Вы экспортируете функцию-член класса void MyFuncLibInterface::myFunc(std::string param);, но пытаетесь импортировать бесплатную функцию void myFunc(std::string param);

Убедитесь, что вы #define MyFuncLib_EXPORTS в проекте DLL.Убедитесь, что вы #include "MyFuncLibInterface.h" в консольном приложении без определения MyFuncLib_EXPORTS.

Проект DLL увидит:

class  __declspec(dllexport) MyFuncLibInterface {
...
}:

А консольный проект увидит:

class  __declspec(dllimport) MyFuncLibInterface {
...
}:

Это позволяет вашему консольному проекту использовать класс из библиотеки DLL.

РЕДАКТИРОВАТЬ: В ответ на комментарий

#ifndef FooH
#define FooH

#ifdef BUILDING_THE_DLL
#define EXPORTED __declspec(dllexport)
#else
#define EXPORTED __declspec(dllimport)
#endif

class EXPORTED Foo {
public:
  void bar();
};


#endif

В проекте, который фактически реализует Foo::bar() BUILDING_THE_DLL, должны быть определены.В проекте, который пытается использовать Foo, BUILDING_THE_DLL должно быть определено , а не . Оба проекта должны #include "Foo.h", но только проект DLL должен содержать "Foo.cpp"

Когда вы затем строите DLL, класс Foo и все его члены помечаются как «экспортированные из этого».DLL».При сборке любого другого проекта класс Foo и все его члены помечаются как «импортированные из DLL»

1 голос
/ 05 октября 2012

Вам нужно импортировать класс, а не функцию.После этого вы можете позвонить ученику.

class  __declspec( dllimport ) MyFuncLibInterface {

public:

MyFuncLibInterface();
~MyFuncLibInterface();

void myFunc(std::string param);

};

int main(int argc, const char* argv[])
{
std::string inputPar = "bla";
MyFuncLibInterface intf;
intf.myFunc(inputPar); //this line produces the linker error
}
...