Странный заголовок не может быть включен ни в main.cpp, ни в window.cpp (класс)

Я должен создать статический линкинг.exe файл из моих.cpp и.h файлов.

Единственное препятствие, которое мне нужно преодолеть, это возможность вызывать одну и ту же функцию. m_pListAll()из двух.cpp файлов, main.cpp а также window.cpp (определение класса под названием Window).

Единственная проблема (по неизвестным причинам) я не могу #include файл заголовка, который дважды определяет m_peDO() main.cpp а также window.cppЯ могу сделать это только один раз, потому что заголовочный файл устанавливает что-то под названием "динамическое связывание" с какой-то странной вещью под названием HINSTANCE(неверно: фактическая причина в разделе ответов):

            //linking.h

            //  This is an extra header file for dynamic linking of the LabJackUD driver.
            //  support@labjack.com

            #ifdef  __cplusplus
            extern "C"
            {
            #endif 

            //For dynamic linking, we first define structures that have the same format
            //as the desired function prototype.
            typedef LJ_ERROR (CALLBACK *tListAll) (long, long, long *, long *, long *, double *);


            //Define a variable to hold a handle to the loaded DLL.
            HINSTANCE hDLLInstance;

            //Define variables for the UD functions.
            tListAll m_pListAll;

            #ifdef  __cplusplus
            } // extern C
            #endif

Есть больше функций, но давайте просто притворимся, что я хочу использовать tListAll m_pListAll в main.cpp и window.cpp. Мой проект Qt содержит следующие файлы:

main.cpp //main code
window.h //header defining a class used in main
window.cpp //cpp thing defining that class's methods
peripheral.h //header file to control my peripheral device
peripheral.lib //library file to control my peripheral device (VC6 only not minGW?!)
linking.h //thing that solves(?) the minGW/VC6 library incompatibility (read on)

Scenario 1) #include <linking.h> in **only** main.cpp
Outcome: m_pListAll() only in scope of main.cpp, out of scope for window.cpp
Scenario 2) #include <linking.h> in **both** main.cpp AND window.cpp
Outcome: Redefinition errors for redefining hDLLInstance and m_pListAll().

Почему я использую эту странную вещь HINSTANCE? Что-то связанное с тем, что мой.lib-файл несовместим с minGW. Если я добавлю библиотеку, чтобы статически быть частью компиляции, я получу::-1: ошибка: нет правила для создания цели 'C:/Users/Joey/Documents/ValvePermissions/libLabJackU.a', необходимой для 'release\ValvePermissions. EXE'. Стоп.

Что я должен делать? Я просто хочу, чтобы эта функция была в области действия window.cpp, но я не хочу использовать этот заголовок дважды из-за ошибок.

1 ответ

Решение

Ваша проблема в том, что вы определили hDLLInstance а также m_pListAll в заголовке, а не просто объявлять их; таким образом, каждая единица перевода, которая включает этот заголовок, будет создавать публичную реализацию каждой из этих переменных, которые все сталкиваются во время соединения.

Вам нужно добавить extern ключевое слово для каждого из этих определений в заголовке, таким образом, преобразуя их в объявления и копируя ваши оригинальные определения (т.е. без extern ключевое слово), только в одну из ваших единиц перевода, (main.cpp возможно), так что во время соединения определена только одна реализация. Таким образом, в заголовке у вас есть:

//Declare a variable to hold a handle to the loaded DLL.
extern HINSTANCE hDLLInstance;

//Declare variables for the UD functions.
extern tListAll m_pListAll;

И в main.cpp, (например):

//Define a variable to hold a handle to the loaded DLL.
HINSTANCE hDLLInstance;

//Define variables for the UD functions.
tListAll m_pListAll;
Другие вопросы по тегам