Разве нельзя создать статическую библиотеку без файла .c?
-
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
не сработало.