Моя собственная библиотека дает мне «неопределенную ссылку на

#c #sdl #lib

#c #sdl #библиотека

Вопрос:

Я пытаюсь создать статическую библиотеку для своих игр, созданную из SDL, просто чтобы упростить процесс создания игр.

Я использую Code::Blocks и компилятор gcc, а также язык C.

Я связал SDL в проекте библиотеки и начал создавать некоторые функции. Затем я написал тестовый проект и связал с ним как SDL, так и мою библиотеку. Но когда я пытаюсь ее выполнить, она дает мне неопределенную ссылку на переменные в моей библиотеке и на функции SDL. Функции моей библиотеки работают, но они вызывают функции SDL внутри, и это те, которые дают мне неопределенную ошибку ссылки.

lib.h Файл выглядит следующим образом:

 #pragma once
#include <SDL2/SDL.h>

extern int awesomeInteger;

extern void foo();
 

lib.c Выглядит так:

 #include "lib.h"

int awesomeInteger = 5;

void foo() {
   awesomeInteger = 6;
   SDL_Function();
}
 

И, наконец, фактический код игры выглядит так:

 #include "lib.h"
// the lib.a file is already linked

int main() {
   foo();
}
 

И затем возникает неопределенная ошибка ссылки на SDL_Function()

Журнал выглядит так:

 ||=== Build: Debug in ExampleProject (compiler: GNU GCC Compiler) ===|
/usr/bin/ld: obj/Debug/lib.o||in function `foo':|
/home/username/Documents/Dev/ExampleProject/lib.c|10|undefined reference to `SDL_Function'|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

 

Комментарии:

1. Вы выполнили установку libsdl?

2. Нет, это необходимо?

3. Как выглядит ваша команда link?

4. Попробуйте настроить свой проект на создание общей библиотеки вместо статической. Эти два типа не очень хорошо сочетаются — вполне вероятно, что функции вашей статической библиотеки не смогут использовать функции из динамических библиотек SDL, и было бы неплохо, если бы в вашей системе были только динамические библиотеки SDL, а не статические.

5. В 2020 году существует несколько причин для создания статических библиотек (по крайней мере, в Linux). См. раздел Руководство по программной библиотеке

Ответ №1:

Не зная подробностей вашей компиляции и компоновки, а также их журналов, вот ссылка на сборку вручную:

  1. Создайте свою статическую библиотеку (без ссылки только для компиляции, позже вы свяжете необходимые библиотеки с вашим фактическим исполняемым файлом)

gcc mylib.c -c

  1. [Необязательно] Если у вас есть несколько объектных файлов, вы можете создать архив (коллекцию объектных файлов)

ar rcs libmylib.a obj1.o obj2.o

  1. Добавьте библиотеку в свою программу, включив объектные файлы в сборку, и свяжите с SDL.

gcc -lSDL2 mygame.c libmylib.a

Комментарии:

1. Я не понимаю, почему вы думаете, что это отвечает на вопрос. OP утверждает, что они успешно создают статическую библиотеку и что они включают как эту, так и соответствующие библиотеки SDL, когда пытаются связать программы. Что же тогда, вы говорите, они делают неправильно или не смогли сделать?

2. Справедливое замечание, но оно служит ориентиром для процесса сборки вручную, устраняя любые проблемы, связанные с автоматизацией сборки code::blocks, например. Редактировать, и я почувствовал, что это слишком длинный пост для комментария.

3. Хорошо, но это не отвечает на вопрос .

4. Я отредактировал сообщение, чтобы отразить, что это просто справочное руководство.