2016-05-04 5 views
-1

У меня есть два источника, которые я хотел бы объединить в одну статическую библиотеку C.Создание статической библиотеки в C

renderay_core.c 
renderay_shapes.c 

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

test.c

#include <stdio.h> 
#include "renderay_core.c" 
#include "renderay_shapes.c" 

int main(void){ 
    Canvas* canvas = new_Canvas(5,5); 
    printf("Test"); 
} 

скомпилирован с:

gcc test.c renderay_core.c renderay_shapes.c -o main.exe 

и он работал отлично.

Теперь я собираюсь упаковать это в статическую библиотеку. Выполнение следующих действий:

gcc -c renderay_core.c renderay_shapes.c 

Теперь у меня есть объекты, готовые для связи в виде библиотеки.

ar rcs librenderay.a renderay_core.c renderay_shapes.c 

Это команда, которую я использую для этого. Затем я пытаюсь скомпилировать свой test.c с библиотекой вместо файлов с обычным исходным кодом.

gcc test.c -o main.exe -static -L -lrenderay 

Теперь, когда я пытаюсь скомпилировать это я получаю предупреждение об ошибке:

неопределенная ссылка на «new_Canvas»

указал мне, что связывание с библиотекой не удалось. Что я здесь делаю неправильно? Что я пропустил?

+0

Подробнее о заголовочных файлах. Не включайте файлы реализации. – Olaf

+0

Вы, похоже, используете 'ar' вместо исходных файлов C, а не файлов объектов. –

ответ

2

Compile - без ссылки - исходных файлы

gcc -c renderay_core.c -o renderay_core.o 
gcc -c renderay_shapes.c -o renderay_shapes.o 

Затем упаковать его

ar -rcs librenderay.a renderay_core.o renderay_shapes.o 

и ссылку на него с помощью

gcc test.c -o main.exe -static -L. -lrenderay 

Вам нужно L указать нестандартное расположение - текущий каталог здесь.

+0

О, я вижу. после -L mybe, вызвавшего проблему ... – xetra11

+0

Да, вам нужен период ('.'), чтобы указать компоновщик в текущий каталог. – sjsam

+0

спасибо, что не знали, что – xetra11

0

Проблема заключается в том, что вы ссылаетесь исходные файлы, но не объектные файлы

ar rcs librenderay.a renderay_core.c renderay_shapes.c 

Это должно быть что-то вроде этого

ar rcs librenderay.a renderay_core.o renderay_shapes.o 

P.S. Вы можете сделать это с помощью Makefile

CFLAGS = -O2 -Wall -fPIC 
OBJS = renderay_core.o renderay_shapes.o 

.c.o: 
    $(CC) $(CFLAGS) -c $< 

librenderay.a: $(OBJS) 
    $(AR) rcs librenderay.a $(OBJS) 

.PHONY: clean 
clean: 
    $(RM) librenderay.a $(OBJS) 
+0

ahhhh ok meh вроде опечатка. Спасибо приятель – xetra11

Смежные вопросы