Посторонняя связь с библиотекой - PullRequest
3 голосов
/ 13 апреля 2010

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

Предположим, у вас есть статическая библиотека A, библиотека динамических общих объектов B и ваша программа C под Linux. Предположим, что библиотека A вызывает функции из библиотеки B, а ваша программа вызывает функции из библиотеки A. Теперь предположим, что все функции, которые C вызывает в A, не используют функции в B.

Для компиляции C будет достаточно связать только A и опустить B, и, кроме того, может ли ваша программа C работать в системе без установленной библиотеки B?

Ответы [ 2 ]

5 голосов
/ 13 апреля 2010

Если ваша программа вызывает функции в A, которые не ссылаются на B, то B не требуется ни во время соединения, ни во время загрузки, при условии, что функции в A находятся в отдельных единицах компиляции, что обычно имеет место для библиотеки.

Компоновщик извлекает функции из библиотеки, которую использует C, и, поскольку ни одна из них не вызывает функции в B, B не понадобится.

4 голосов
/ 13 апреля 2010

Перегрузка имени святого заполнителя, Бэтмен. Давайте сначала заменим A, B и C на libstatic, libshared и myapp, чтобы сделать вещи немного более разборчивыми:

Предположим, у вас есть статическая библиотека libstatic, и библиотека динамических общих объектов libshared и ваша программа myapp под linux. предполагать эта библиотека libstatic вызывает функции из библиотека libshared и ваша программа (myapp) вызывает функции из библиотеки libstatic. Теперь предположим что все функции, которые myapp вызывает в libstatic не использовать функции в libshared.

Для компиляции myapp будет достаточно ссылки просто libstatic и пропустите libshared и, кроме того, можете ваша программа myapp будет запущена в системе без библиотеки libshared установлена?

Итак, насколько я понимаю ваш вопрос, есть библиотека libstatic, некоторых функций, в которых используется libshared. Вы хотите знать: если я не использую любую из libstatic функций, которые зависят от libshared, будет ли myapp связываться и работать без libshared?

Ответ - да, если верны две вещи:

  1. Звонки, которые вы делаете на libstatic, не зависят от libshared напрямую или косвенно . Это означает, что если myapp вызывает функцию в libstatic, которая вызывает другую функцию в libstatic, которая вызывает функцию в libshared, то myapp теперь зависит от libshared.

  2. Вызовы, которые вы делаете в libstatic, не зависят от какой-либо функции в libstatic, реализация которой появляется в том же модуле компиляции (объектный файл) с вызовом libshared. Компоновщик вводит код из статической библиотеки на уровне объектных файлов, а не на уровне отдельных функций. И помните, эта зависимость аналогично связана, поэтому если вы вызываете функцию в foo.o, а что-то еще в foo.o вызывает функцию в bar.o, а что-то в bar.o зависит от libshared, вы тост.

Когда вы связываете статическую библиотеку с приложением, связываются только объектные файлы, содержащие символы (прямо или косвенно). Таким образом, если окажется, что ни один из объектных файлов, которым myapp не требуется libstatic, зависит от libshared, то myapp не зависит от libshared.

...