Разве нельзя создать статическую библиотеку без файла .c?

StackOverflow https://stackoverflow.com//questions/11705324

  •  13-12-2019
  •  | 
  •  

Вопрос

У меня есть два файла -> fact.h и main.c в /home/snyp1/new папка. main.c имеет основную функцию, которая вызывает fact(int x) функционировать в fact.h.Я создаю .a архив с помощью команды ar ->

snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h  fact.o  libfact.a  main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

У меня убунту 12.04.Пожалуйста, дайте мне знать, что случилось.(Кроме того, если я не использую -L/.../new, gcc скажет, что не может найти "lfact", возможно, потому, что его нет в /usr/local/lib)

РЕДАКТИРОВАТЬ:ОК, я нашел причину.Это из-за того, что я использовал fact.h построить fact.o а затем поместив его в библиотеку, он работал не так, как ожидалось.Поэтому я теперь изменил его на file.c и сейчас работает нормально.Я должен был предоставить эту информацию, извините.Хотя я не знаю, почему должна возникнуть такая проблема.Нельзя ли создать библиотеки без хотя бы одного .c файл в нем?

Это было полезно?

Решение

Я использовал fact.h для создания fact.o, а затем поместил его в библиотеку, но он не работал должным образом.

Вы имеете в виду, что собирали fact.h производить fact.o?

Если так, то это не то, что вы ожидаете.Когда вы вызываете gcc в файле заголовка он создает предварительно скомпилированный заголовок, нет объектный файл.Итак, хотя у вас есть файл с именем foo.o это был недопустимый объектный файл.Если бы ты только что побежал gcc -c fact.h это создало бы предварительно скомпилированный заголовок fact.gch, но, видимо, ты побежал gcc -c fact.h -o fact.o что приводит к вызову файла fact.o хотя это все еще предварительно скомпилированный заголовок. file fact.o показал бы, что:

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

Вы могли бы заставить GCC рассматривать файл как код C, а не заголовок, запустив gcc -x c -c fact.h -o fact.o ( -x c говорит, что входные данные следует обрабатывать как код C, а не определять тип по расширению файла), но, вероятно, проще и менее запутанно просто правильно назвать файл, а не пытаться скомпилировать заголовок.

Разве невозможно создать библиотеки без хотя бы одного файла .c?

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

если я не использую -L/.../new, gcc скажет, что не может найти "lfact", возможно, потому, что его нет в /usr/local/lib

Компоновщик не только просматривает /usr/local/lib, есть и другие места по умолчанию, но да, в этом вся проблема.Обратите внимание, что вы также можете сказать -L. если библиотека находится в текущем каталоге, это проще, чем указывать абсолютный путь.

Другие советы

Я не уверен ar поддерживает тире во всем, кроме первого варианта.Пытаться

ar -rs libfact.a fact.o

или просто

ar rs libfact.a fact.o

Имейте в виду, я не знаю, зачем бежать ranlib не сработало.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top