Многочисленные определения, включая библиотеку с открытым исходным кодом (с на первый взгляд правильными настройками компоновщика?)

Я работаю над программой для моих исследований, которая использует библиотеку с открытым исходным кодом. Он предназначен для работы на 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
Другие вопросы по тегам