Ответ 1
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread
У меня есть следующий make файл
CXXFILES = pthreads.cpp
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = -lpthread -ldl
all:
$(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)
clean:
rm -f prog *.o
Я пытаюсь включить библиотеку ./libmine
в CXXFLAGS
, но похоже, что это не правильный способ включить статическую библиотеку, потому что когда я компилирую программу, я получаю много ошибок undefined. Итак, что на самом деле является правильным способом включить статическую библиотеку в make файл?
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread
использовать
LDFLAGS= -L<Directory where the library resides> -l<library name>
Вроде:
LDFLAGS = -L. -lmine
для обеспечения статической компиляции вы также можете добавить
LDFLAGS = -static
Или вы можете просто избавиться от поиска всей библиотеки и напрямую связаться с ней.
сказать, что у вас есть main.c fun.c
и статическая библиотека libmine.a
то вы можете просто сделать в своей последней строке ссылки Makefile
$(CC) $(CFLAGS) main.o fun.o libmine.a
Убедитесь, что перед параметром -l
отображается параметр -l
; порядок опций в командной строке линкера имеет значение, особенно со статическими библиотеками. Параметр -l
указывает каталог для поиска библиотек (статический или общий). Опция -lname
указывает библиотеку с libmine.a
(статическим) или libmine.so
(используется для большинства вариантов Unix, но для Mac OS X используются .dylib
и HP-UX, используемые для использования .sl
). Обычно статическая библиотека будет находиться в файле libmine.a
. Это соглашение, не обязательное, но если имя не находится в формате libmine.a
, вы не можете использовать нотацию -lmine
, чтобы найти его; вы должны явно указать его в командной строке компилятора (компоновщика).
Опция -L./libmine
указывает: "существует подкаталог с именем libmine
, который можно найти для поиска библиотек". Я вижу три возможности:
libmine.a
, и в этом случае вам также нужно добавить -lmine
к линии компоновщика (после файлов объектов, ссылающихся на библиотеку).libmine
, который является статическим архивом, и в этом случае вы просто указываете его как файл ./libmine
без -l
впереди.libmine.a
в текущем каталоге, который вы хотите получить. Вы можете написать ./libmine.a
или -L . -lmine
, и оба должны найти библиотеку. -L
просто указывает путь, где можно найти файл .a
или .so
. Вы хотите добавить -lmine
к переменной LIBS
.
Сделайте это -static -lmine
, чтобы заставить его выбрать статическую библиотеку (в случае существования как статической, так и динамической библиотеки).
Несмотря на мои просьбы к властям (нет ответов), я все еще не могу опубликовать свой собственный вопрос. Я ищу помощи в решении этой задачи: у меня есть основной проект и статическая библиотека, связанная с ним. Все работает как положено. Поскольку оба проекта находятся в стадии разработки, я должен сначала скомпилировать библиотеку, а затем основной проект. Я знаю, что есть способ автоматизировать этот процесс, использовал его много лет назад в MFC (пакетные файлы?), Но не помню деталей. Нечто связанное с предварительной/последующей обработкой.