Многочисленные определения, включая библиотеку с открытым исходным кодом (с на первый взгляд правильными настройками компоновщика?)
Я работаю над программой для моих исследований, которая использует библиотеку с открытым исходным кодом. Он предназначен для работы на Raspberry Pi (ядро Raspbian). Из-за моего намерения также иметь возможность загрузить его на ПЛК, я использовал в основном чистый C. Сама библиотека поставляется с подходящими заголовочными и.c файлами.
Когда я использую предустановленный компилятор GCC на Raspberry, моя программа компилируется без ошибок и работает нормально. Теперь вот моя проблема:
Я пытался заставить этот проект работать на Windows, используя IDE code:: blocks с установленным MinGW. Я снова посетил библиотеку и скачал zip для windows (примерно тот же заголовок и файл.c, но также.lib и.dll включены).
Я установил поисковые директории и настройки компоновщика в проекте и включил заголовок, как обычно, с #include "header.h"
для относительного пути. Он не компилируется и дает много multible definition
а также first defined here
которые обычно указывают на неправильную связь и включение.
Когда я попытался определить некоторые из этих определений, я заметил, что функции, которые вызывают ошибки, определяются один раз в файле library.c. В начале этого файла.c он также включает заголовок один раз.
Краткое содержание:
Это работает с распбианским GCC:
$ gcc -sdt=c99 main.c library.c -o executable
но выдает ошибки с Windows IDE + MinGW
Я скучаю по чему-то серьезному? Динамическая ссылка lib должна использоваться только исполняемым файлом впоследствии. Я думал, может быть libraby.c
заменяется library.lib
но если я удаляю одну из них, проект не знает функций. Я также искал неправильные включения. Я действительно нахожусь в конце моих знаний здесь, и также искал сообщения, которые могли бы помочь мне, но это были в основном "где путь компоновщика" или "включение файлов.c". Это кажется такой простой проблемой, которую я упустил.
Любая помощь будет оценена. Я предоставлю более подробную информацию, если это необходимо. Спасибо!
Изменить (2):
obj\Debug\open62541.o:open62541.c:(.text+0x3152a): undefined reference to `__imp_shutdown'
obj\Debug\open62541.o:open62541.c:(.text+0x3153f): undefined reference to `__imp_closesocket'
obj\Debug\open62541.o:open62541.c:(.text+0x315a7): undefined reference to `__imp_send'
obj\Debug\open62541.o:open62541.c:(.text+0x315b9): undefined reference to `__imp_WSAGetLastError'
.....
Редактировать (3)
Ответ 1! Скомпилировано хорошо, спасибо всем.
1 ответ
Похоже, ваша библиотека открыта62541.
Есть два способа включить библиотеку в ваш источник:
- Создайте общую / статическую библиотеку и свяжите ее с вашим кодом
- Включите объединение, которое генерирует один файл.c и.h, который вы можете напрямую скомпилировать с вашим кодом
Вы комбинируете оба метода в mingw, который добавляет целую библиотеку два раза. Возможно, вы хотите связать только файл.c без.lib, поэтому ваша команда компиляции должна выглядеть примерно так:
gcc -sdt=c99 main.c open62541.c -o test
Кроме того, поскольку open62541 нуждается в библиотеке ws2_32 в Windows, компилятор должен вызываться с помощью:
gcc -std=c99 main.c open62541.c -o test -lws2_32