Получение Winegcc для связи с dll. Входной файл компоновщика не используется, поскольку связывание не выполнено, *.o — п ⇐ 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), имеют фиолетовый цвет или одну и ту же справочную страницу на различных веб-страницах, я обращаюсь к вам нужны идеи, как заставить это работать.
Я пытаюсь скомпилировать код 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), имеют фиолетовый цвет или одну и ту же справочную страницу на различных веб-страницах, я обращаюсь к вам нужны идеи, как заставить это работать.
Мобильная версия