Подтвердить что ты не робот

Как включить статическую библиотеку в make файл

У меня есть следующий 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 файл?

4b9b3361

Ответ 1

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread 

Ответ 2

использовать

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

Ответ 3

Убедитесь, что перед параметром -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, и оба должны найти библиотеку.

Ответ 4

-L просто указывает путь, где можно найти файл .a или .so. Вы хотите добавить -lmine к переменной LIBS.

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

Ответ 5

Несмотря на мои просьбы к властям (нет ответов), я все еще не могу опубликовать свой собственный вопрос. Я ищу помощи в решении этой задачи: у меня есть основной проект и статическая библиотека, связанная с ним. Все работает как положено. Поскольку оба проекта находятся в стадии разработки, я должен сначала скомпилировать библиотеку, а затем основной проект. Я знаю, что есть способ автоматизировать этот процесс, использовал его много лет назад в MFC (пакетные файлы?), Но не помню деталей. Нечто связанное с предварительной/последующей обработкой.