почему статические библиотеки используют перемещаемые объектные файлы, а общие библиотеки используют исходный файл?

Никогда не использовать:

for d in $(ls)

Используйте вместо этого:

for d in *

Две проблемы, среди прочих, связанные с использованием $(ls)заключаются в том, что оболочка подвергает результаты $(ls)разбиению слов и расширению имени пути . В вашем случае разделение слов привело к тому, что mozilla foundationпревратилось в mozillaи foundation.

Более подробное обсуждение причин не использовать $(ls)см. в "Что делает $(ls *.txt)?"

Если вам нужно учитывать случай, когда в каталоге (нет не -скрытого файла, случай, когда for i in $(ls)может выглядеть лучше, поскольку он не выполняет никакого прохода в цикле, в отличие от один проход в цикле с *как $iв for i in *(, за исключением zsh)), вы хотите указать оболочке не расширяться ни к чему для не -совпадающих глобусов:

  • zsh:for i in *(N)
  • ksh93:for i in ~(N)*
  • bash4.4+:f() { local -; shopt -s nullglob; for i in *;...; done; }; f(смысл в том, чтобы использовать опцию nullglobлокально (см. также опцию failglobдля поведения, аналогичного zshпо умолчанию )).
  • yash:set -o nullglob(и затем сброс, насколько я знаю, нет локальной области для параметров в yash)
  • в других оболочках вы всегда можете добавить [ -e "$i" ] || [ -L "$i" ] || continueв цикл для проверки существования файла.

0
02.09.2020, 12:03
1 ответ

Вы можете создавать объекты-компоненты разделяемой библиотеки отдельно:

gcc -fpic -c addvec.c multvec.c
gcc -shared -fpic -o libvector.c addvec.o multvec.o

Обратите внимание, однако, что все этапы компиляции и компоновки должны использовать одни и те же флаги. Я подозреваю, что это основная причина подхода, используемого в вашем учебнике. Статической библиотеке не нужен независимый от позиции -код, а разделяемой библиотеке он нужен. Вместо того, чтобы явно создавать отдельные объектные файлы дважды или «тратить» PIC на статическую библиотеку, общая библиотека создается с использованием PIC из исходных файлов.

2
18.03.2021, 23:07

Теги

Похожие вопросы