Ошибка при импорте / экспорте переменной

Я пытаюсь экспортировать / импортировать переменную между exe и dll. Есть три папки. B.cpp в одной папке, производящей exe. C.cpp находится в другой папке, которая производит dll.

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

A.cpp находится в папке, которая производит dll.

В A.h

__declspec(dllexport) extern int* val;

В A.cpp

__declspec(dllexport) int* val;

B.cpp

#include <A.h>
set val

C.cpp

#include <A.h>
get val and using val in some function

** Я получаю сообщение об ошибке B.obj: ошибка LNK2001: неразрешенный внешний символ

Я был бы очень признателен за любую помощь или, по крайней мере, за совет, где я могу узнать больше об этой проблеме.

@AlanBirtles Можете ли вы указать на ошибку точнее, я не могу понять по предоставленной вами ссылке

mg9893 26.10.2018 08:57

Не без минимальный воспроизводимый пример, вы связываете файл библиотеки своей dll из исполняемого файла? Также обратите внимание, что вам, вероятно, нужен #define, а не #pragma push_macro.

Alan Birtles 26.10.2018 10:26
0
3
50
1

Ответы 1

Для ваших макросов используйте что-то вроде

#ifdef VAL_EXPORTS  
#define VAL_API __declspec(dllexport)   
#else  
#define VAL_API __declspec(dllimport)   
#endif

В A.h объявите его с помощью extern, то есть VAL_API extern int* val;, а в A.cpp определите его без extern, то есть VAL_API int* val = nullptr;

В B.h, #include A.h и присвоить ему любое значение.

В C.h просто #include A.h, и вы можете использовать val.

Вместо того, чтобы помещать его в B.h и C.h, не следует ли его помещать в B.cpp и C.cpp. Кроме того, поскольку в B.cpp я буду экспортировать, я также должен определить #define VAL_EXPORTS?

mg9893 26.10.2018 10:29

@ mg9893 Вы также можете поместить его в B.cpp или C.cpp. Вы не экспортируете и не импортируете B.h/cpp или C.h/cpp. Вы экспортируете только в A.h (который, как я предполагаю, находится в dll), поэтому A.h нужен только для #define VAL_EXPORTS.

Nyque 26.10.2018 10:52

Мы не импортируем в B.cpp или C.cpp? Если мы не определяем VAL_EXPORTS в B.cpp и C.cpp, мы выполняем часть else, что означает, что мы импортируем

mg9893 26.10.2018 11:07

@ mg9893 Нет, он не импортируется в B.cpp или C.cpp. Для упрощения теста вы можете просто заменить VAL_API на __declspec(dllexport), и результат будет таким же.

Nyque 26.10.2018 11:16

Я не могу решить проблему, используя ту же ошибку, но в B.obj. (ошибка LNK2001: неразрешенный внешний символ) Есть идеи, почему это может произойти?

mg9893 26.10.2018 11:28

@ mg9893 Можете ли вы отредактировать сообщение и обновить код? Также укажите, находится ли файл в dll или exe.

Nyque 26.10.2018 11:33

@ mg9893 Просто чтобы подтвердить, вы используете неявное связывание и устанавливаете val в B.cpp внутри функции? Кроме того, ваш #include должен использовать кавычки "" вместо угловых скобок <>.

Nyque 26.10.2018 12:01

да, я использую неявное связывание и устанавливаю val в B.cpp внутри функции. И я исправил на "" вместо <>.

mg9893 26.10.2018 12:15

@ mg9893 Вы ссылались на dll_name.lib? Я могу воспроизвести вашу ошибку, только если я не указал на нее ссылку. Если вы используете Visual Studio, это Properties -> Linker -> Input -> Additional Dependencies. Убедитесь, что вы добавили dll_name.lib, а не dll_name.dll. Когда вы компилируете проект в dll, автоматически создается файл lib.

Nyque 26.10.2018 13:04

Другие вопросы по теме