Как сохранить свободную функцию из статической библиотеки в общей библиотеке

Если вы хотите использовать одну переменную и выполнить с ней действие, вам просто нужно использовать один цикл:

for file in 4 5 6 7 8
do
   paste "${file}_1" "${file}_2"
done

Это будет делать

paste 4_1 4_2
paste 5_1 5_2
...
1
задан Julien 13 July 2018 в 17:50
поделиться

1 ответ

Когда компоновщик сталкивается с объектным файлом foo.o во входной последовательности, он безоговорочно связывает его с выходным файлом (программой или разделяемой библиотекой).

Когда он встречает статическую библиотеку, libbar.a , он (по умолчанию) проверяет архив для поиска любых объектных файлов, например libbar.a(foo.o), которые предоставляют определения для неразрешенных символов, на которые ссылаются уже существующие объектные файлы (или разделяемые библиотеки).

Если он находит какие-либо такие файлы объектов, он извлекает их из архива и связывает их с выходом файл, точно так, как если бы они были отдельно перечислены в командной строке, а статическая библиотека вообще не упоминалась. Если он не найден, архив ничего не делает для связи.

В вашей первой компиляции и привязке:

$ g++ test.cpp -shared -o libtest-without-static.so

g++ разбивает ее (как он должен) на этапе компиляции и на этапе ссылки эффективно:

    $  g++ -c -o temporary.o test.cpp
    $  g++ temporary.o -shared -o libtest-without-static.so

, в котором temporary.o связано безоговорочно.

В вашей второй ссылке:

$ g++ -shared libtest.a -o libtest-with-static.so

член одиночного архива libtest.a(test.o) не может определить какие-либо неразрешенные ссылки, которые уже были связаны, потому что их нет. libtest.a ничего не способствует связыванию разделяемой библиотеки, а выходная разделяемая библиотека не содержит никаких символов, кроме шаблона, предоставленного библиотеками по умолчанию для ссылки g++ -shared ....

Цель по умолчанию статических библиотек в привязке, в отличие от индивидуально названных объектных файлов, заключается в том, чтобы предложить компоновщику пакет объектных файлов, из которых можно выбрать только те, которые ему нужны, чтобы удовлетворить нерешенные ссылки, уже имеющиеся. Вам не нужно точно знать, какие из них они будут. Вам просто нужно знать, что они в этой сумке. Вы должны связать хотя бы один объектный файл перед любой статической библиотекой, если будут какие-либо нерешенные ссылки, которые могут удовлетворить члены статической библиотеки. Или укажите --whole-archive.

1
ответ дан Mike Kinghan 17 August 2018 в 12:19
поделиться
Другие вопросы по тегам:

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