Получение Winegcc для связи с dll. Входной файл компоновщика не используется, поскольку связывание не выполнено, *.o — пC++

Программы на C++. Форум разработчиков
Ответить
Гость
 Получение Winegcc для связи с dll. Входной файл компоновщика не используется, поскольку связывание не выполнено, *.o — п

Сообщение Гость »


Я пытаюсь скомпилировать код C++, который использует dll Windows в Linux, используя Winegcc. Мне предоставлены файлы .dll, .lib и некоторые .h, но у меня нет доступа к исходному коду.

Я настроил базовый проект, следуя инструкциям, прилагаемым к библиотеке Windows, в Visual Studio, чтобы получить представление о самом проекте. Благодаря этому я узнал, что библиотека, похоже, предназначена для 32-битной версии.

Файл заголовка, который будет использоваться с библиотекой, включает _declspec(dllexport) и __declspec(dllimport). Winegcc это не понравилось, поэтому я добавил еще одно подчеркивание. Это приводит к тому, что Winegcc предупреждает меня об их игнорировании. При использовании [[gnu::dllimport]] это также игнорируется.

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

Выполнение winegcc Coursework1.cpp ICS0017DataSource.dll -m32 приводит к следующему:

В файле, включенном в Coursework1.cpp:9: ICS0017DataSource.h:15:51: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 15 | LIBSPEC HEADER_B *GetStruct1(int iItem, int nItems); | ^ ICS0017DataSource.h:16:51: предупреждение: директива атрибута области действия gnu::dllimport игнорируется [-Wattributes] 16 | LIBSPEC HEADER_C *GetStruct2(int iItem, int nItems); | ^ ICS0017DataSource.h:17:52: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 17 | LIBSPEC HEADER_A **GetStruct3(int iItem, int nItems); | ^ ICS0017DataSource.h:18:51: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 18 | LIBSPEC HEADER_D *GetStruct4(int iItem, int nItems); | ^ ICS0017DataSource.h:19:51: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 19 | LIBSPEC HEADER_E *GetStruct5(int iItem, int nItems); | ^ ICS0017DataSource.h:20:53: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 20 | LIBSPEC void *GetItem(int iItem, char *pID = nullptr); | ^ gcc: предупреждение: ICS0017DataSource.dll: входной файл компоновщика не используется, поскольку связывание не выполнено Winebuild: tmp6511ca03/ICS0017DataSource-00000001.o — пустой файл. Winegcc: /usr/bin/winebuild не удалось winegcc Coursework1.cpp ICS0017DataSource.lib -m32

В файле, включенном в Coursework1.cpp:9: ICS0017DataSource.h:15:51: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 15 | LIBSPEC HEADER_B *GetStruct1(int iItem, int nItems); | ^ ICS0017DataSource.h:16:51: предупреждение: директива атрибута области действия gnu::dllimport игнорируется [-Wattributes] 16 | LIBSPEC HEADER_C *GetStruct2(int iItem, int nItems); | ^ ICS0017DataSource.h:17:52: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 17 | LIBSPEC HEADER_A **GetStruct3(int iItem, int nItems); | ^ ICS0017DataSource.h:18:51: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 18 | LIBSPEC HEADER_D *GetStruct4(int iItem, int nItems); | ^ ICS0017DataSource.h:19:51: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 19 | LIBSPEC HEADER_E *GetStruct5(int iItem, int nItems); | ^ ICS0017DataSource.h:20:53: предупреждение: директива атрибута области действия «gnu::dllimport» игнорируется [-Wattributes] 20 | LIBSPEC void *GetItem(int iItem, char *pID = nullptr); | ^ /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libm .so при поиске -lm /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libc .so при поиске -lc /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libgcc_s .so.1 при поиске libgcc_s.so.1 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libc .so при поиске -lc /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libgcc_s .so.1 при поиске libgcc_s.so.1 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: tmp6511e54b/Coursework1-00000000.o: в функции `main' : Coursework1.cpp:(.text+0x25): неопределенная ссылка на GetStruct2. /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: Coursework1.cpp:(.text+0x37): неопределенная ссылка для `GetItem' Collect2: ошибка: ld вернул 1 статус выхода Winegcc: Ошибка /usr/bin/gcc GetStruct2 и GetItem — это функции, реализованные в dll.

Поэтому я решил попробовать выполнить связывание отдельно: winegcc -c Coursework1.cpp -m32 Выдает только предупреждения об игнорировании dllimport.

wineg++ -m32 -o Coursework1 Coursework1.o -lICS0017DataSource

/usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: невозможно найти -lICS0017DataSource: Данный файл или каталог отсутствует /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libm .so при поиске -lm /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libc .so при поиске -lc Collect2: ошибка: ld вернул 1 статус выхода Winegcc: /usr/bin/g++ не удалось Это также происходило при использовании gcc и/или определении пути с помощью -L или просто -L, он продолжает искать файл, который начинается с -l…

wineg++ -m32 -o Coursework1 Coursework1.o ICS0017DataSource.lib

/usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/ ../lib64/libm.so при поиске -lm /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libc .so при поиске -lc /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libgcc_s .so.1 при поиске libgcc_s.so.1 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libc .so при поиске -lc /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: пропуск несовместимого /usr/bin/../lib64/libgcc_s .so.1 при поиске libgcc_s.so.1 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: Coursework1.o: в функции `main': Coursework1.cpp:(.text+0x25): неопределенная ссылка на GetStruct2. /usr/lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/bin/ld: Coursework1.cpp:(.text+0x37): неопределенная ссылка для `GetItem' Collect2: ошибка: ld вернул 1 статус выхода Winegcc: /usr/bin/g++ не удалось Это было вдохновлено тем, как это работало в Visual Studio, где файл lib нужно было настроить для использования где-то. Поскольку это не сработало, я еще покопался и нашел сообщение, в котором говорилось, что можно также ссылаться непосредственно на dll:

wineg++ -m32 -o Coursework1 Coursework1.o ICS0017DataSource.dll

g++: предупреждение: ICS0017DataSource.dll: входной файл компоновщика не используется, поскольку связывание не выполнено Winebuild: tmp6511bef3/ICS0017DataSource-00000000.o — пустой файл Winegcc: /usr/bin/winebuild не удалось Этот сбой аналогичен тому, что происходит при использовании Winegcc для файла cpp и библиотеки DLL.

Поскольку к настоящему времени почти все ссылки, которые я нахожу (для gcc в целом, MinGW, поскольку Winegcc должен имитировать поведение их gcc и самого Winegcc), имеют фиолетовый цвет или одну и ту же справочную страницу на различных веб-страницах, я обращаюсь к вам нужны идеи, как заставить это работать.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»