Проблема создания статического Lib в Linux - PullRequest
1 голос
/ 13 марта 2009

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

Вот мой make-файл:

CC=gcc
CFLAGS=-Wall -g -Wextra
OBJS=getline.o debug.o
LIB=libjimi.a
.PHONY: clean purge

libjimi.so : $(OBJS)
        ar rcs $(LIB) $(OBJS)
        @echo done!
%.o : %.c
        $(CC) $(CFLAGS) -c $^

clean :
        @rm *.o

purge : clean
        @rm $(LIB)

Теперь я получаю segfault, если связываю библиотеку, но если я связываю объектные файлы, которые я связываю для создания библиотеки, это работает ... совет?

Ответы [ 2 ]

2 голосов
/ 13 марта 2009

Ваша цель, скажем, libjimi.so, которая является расширением для разделяемой библиотеки, должна быть просто libjimi.a для статической библиотеки.

И обратите внимание, что при использовании статической библиотеки вы просто связываете ее, как и любой другой объектный файл, но с общей библиотекой вы используете синтаксис -l.

1 голос
/ 13 марта 2009

Статические библиотеки в Linux (Unix) обычно заканчиваются на '.a'; общие объекты заканчиваются на '.so'. Ваше библиотечное правило в настоящее время:

libjimi.so : $(OBJS)
    ar rcs $(LIB) $(OBJS)
    @echo done!

Должно быть:

$(LIB): $(OBJS)
    ar rcs $(LIB) $(OBJS)
    @echo done!

Лично я склонен использовать

AR      = ar
ARFLAGS = rv

Ведущий к:

$(LIB): $(OBJS)
    $(AR) $(ARFLAGS) $(LIB) $(OBJS)

Теперь все аспекты сборки можно настроить, задав макросы - при необходимости.

Не зная, где происходит авария, трудно понять, что может быть причиной. Одна возможность состоит в том, что из-за путаницы с make-файлом вы связываетесь со старой версией библиотеки, а не с текущей рабочей версией.

Кстати, нехорошо скрывать, что делает цель clean или purge; гораздо лучше позволить make отображать команды (без @ впереди). @ полностью подходит для echo; его отсутствие приведет к тому, что одна и та же информация будет представлена ​​дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...