2015-08-27 2 views
1

Предположим, я хочу скомпилировать a.cpp и b.cpp в две отдельные библиотеки liba.so и libb.so, и две библиотеки взаимозависимы, как я могу это сделать?C++: Как создать две взаимозависимые разделяемые библиотеки?

+0

попробуйте этот http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html –

+1

Просто из любопытства, почему вы хотите это сделать? Если каждая библиотека зависит от другой, они обе бесполезны, если только каждый из них не присутствует. Каково было бы вам преимущество в простом создании единой библиотеки? – enhzflep

+0

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

ответ

3

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

Хотя вы явно не указали, какую платформу вы используете, а детали реализации разделяемой библиотеки очень специфичны для платформы, так что в любом случае ответ на этот вопрос зависит от платформы - учитывая имена общих библиотек, которые вы упомянули в своем вопросе «liba.so» и «libb.so», вы, скорее всего, используете Linux.

Большинство современных дистрибутивов Linux настроили свой загрузчик во время выполнения, чтобы приложение могло разрешать внешние ссылки только из разделяемых библиотек, с которыми приложение явно связывается. Если ваше приложение связано с liba.so, которое связывается с libb.so, ваше приложение не сможет разрешать внешние ссылки из libb.so и наоборот.

Таким образом, поскольку ваше приложение явно должно связываться с обеими разделяемыми библиотеками, весь этот вопрос является спорным. Вы также можете создавать как общие библиотеки по отдельности, так и напрямую связывать свои приложения с обоими из них. В противном случае это не сработает.

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

liba.so: liba.so-target libb.so-target 
    [link command with -llibb.so] 

libb.so: libb.so-target liba.so-target 
    [link command with -lliba.so] 

liba.so-target: [all object modules that build liba.so] 
    [link command without -llibb.so] 
    touch liba.so-target 

libb.so-target: [all object modules that build libb.so] 
    [link command without -lliba.so] 
    touch libb.so-target 

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

Это не идеальный вариант на 100%, этот подход может вызвать случайные проблемы с параллельными параллельными сборками, но это общая идея. Я все же полагаю, что, учитывая текущую конфигурацию загрузчика Linux во время выполнения, ваше приложение должно быть явно связано с обеими библиотеками, что делает все это совершенно ненужным.