Это скомпилированная библиотека переносимая? - PullRequest
2 голосов
/ 15 октября 2019

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

Спасибо

Лоренцо

1 Ответ

1 голос
/ 16 октября 2019

Как правило, нет , оно не переносимо в том смысле, что скомпилированная библиотека может быть связана в любой другой системе. Скомпилированная библиотека должна быть совместима с целевой архитектурой, ОС, системой компилятора, чтобы назвать некоторые из них.


Но у вас есть другой выбор, заключенный из вашего комментария: кажется, что вы также предоставляете некоторыесценарий оболочки или make-файл для сборки программ.

Поскольку библиотека состоит из "просто" набора скомпилированных модулей перевода, прежде чем некоторые из них будут связаны с программами, вы можете взять набор источников этих модулей переводаи скомпилируйте их с источниками каждой программы, где это уместно.

В качестве примера, скажем, у вас есть 2 функции (каждая в своем собственном исходном файле), которые вы используете в разных комбинациях в 3 программах. «prg1» использует func1(), «prg2» использует func2(), а «prg3» использует оба.

Это могут быть команды для сборки программ с (статической) библиотекой:

gcc -c func1.c -o func1.o
gcc -c func2.c -o func2.o
ar -r lib.a func1.o func2.o
gcc prg1.c lib.a -o prg1
gcc prg2.c lib.a -o prg2
gcc prg3.c lib.a -o prg3

Вместо библиотеки вы напрямую компилируете исходные коды программ:

gcc prg1.c func1.c -o prg1
gcc prg2.c func2.c -o prg2
gcc prg3.c func1.c func2.c -o prg3

Результаты такие же, по крайней мере, если вы статически связывались с библиотекой.

Но даже с разделяемой (динамической) библиотекой подход будет таким же. Совместно используемые библиотеки «только» сохраняют часть оперативной памяти, если несколько программ, использующих их, запускаются одновременно . Если одновременно выполняется только одна программа, динамически связанной программе может потребоваться больше оперативной памяти и она загружается медленнее.

...