Как писать модули на Windows? - PullRequest
       0

Как писать модули на Windows?

0 голосов
/ 04 сентября 2011

В настоящее время я пишу программу, которая должна работать как в Windows, так и в Linux.Программа использует динамические модули (LoadLibrary / dlopen) для упрощения развертывания различных функций.

Linux-часть работает просто отлично: основная программа экспортирует функции и переменные с помощью -Wl, - export-dynamic, чтобы модули моглидоступ к ним, и модули могут быть скомпилированы с опцией gcc -shared без необходимости разрешения всех символьных зависимостей при связывании.

В Windows (с использованием MSVC 2010) это, похоже, не работает.Я экспортирую функции и переменные из основной программы, используя __declspec (dllimport), но я не могу получить доступ к функциям и переменным из основной программы, потому что не удается выполнить связывание (неразрешенная внешняя, LNK1120).

Как поступитьс этим?Спасибо.

Редактировать (пример кода):

core-file.cpp

#include "core-file.hpp"

Cls_A cls_instance;

void Cls_A::do_something() {
    while(0);
}

core-file.hpp

#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif

class TEST_API Cls_A {
public:
    void do_something();
};

extern Cls_A cls_instance;

module.cpp

#include "core-file.hpp"

TEST_API int my_init_function() {
    cls_instance.do_something();
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

__declspec(dllimport) предназначен для того, когда вы компилируете программу, которая использует DLL. Когда вы компилируете настоящую DLL, вы хотите использовать __declspec(dllexport).

Ваше использование должно быть последовательным. Типичная идиома - определить макрос, который будет использовать dllimport и dllexport, основываясь на наличии макроса. В проекте строит DLL, вы определяете макрос, который означает экспорт функций, а в других проектах вы не определяете его, что означает их импорт:

#ifdef PROJECT_NAME_BUILD_DLL
  #define DLL_SYMBOL __declspec(dllexport)
#else //PROJECT_NAME_BUILD_DLL
  #define DLL_SYMBOL __declspec(dllimport)
#endif //PROJECT_NAME_BUILD_DLL

DLL_SYMBOL void SomeFunction(Type value);

Проект, который создает DLL, определит PROJECT_NAME_BUILD_DLL; проекты, которые используют DLL, которая включает этот заголовок, не определяют это.

0 голосов
/ 04 сентября 2011

В Windows, когда вы хотите связать с экспортированными символами, вы должны помнить, чтобы указать все библиотеки импорта, которые были сгенерированы, когда вы связали модули, символы которых вы хотите импортировать. (Вы можете просто оставить символы неразрешенными в Linux, потому что формат исполняемого файла отличается и возможно отложить разрешение символов до времени загрузки.)

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