Связывание проблемы с косвенными зависимостями в Mac OS X - PullRequest
1 голос
/ 13 января 2009

у нас есть некоторые проблемы с косвенными зависимостями. Судя по тому, что я читал в Интернете, это может быть связано с использованием двухуровневого пространства имен. Это происходит, когда мы связываемся с библиотекой boost, если быть точным, boost_filesystem, которая сама зависит от boost_system. Компоновщик не разрешает зависимость между boost_filesystem и boost_system. Может кто-нибудь дать мне несколько советов, как это можно решить? Добавление boost_system вручную к зависимостям кажется уродливым, кроме того, оно отлично работает на других платформах.

Ответы [ 2 ]

2 голосов
/ 06 марта 2009

Некоторые версии редактора статических ссылок ld на Mac не разрешают косвенные зависимости через опцию -L, а вместо этого просто ищут их через имя_установки, которое встраивается в прямую зависимость. Запуск otool -L на boost_filesysten покажет вам, где ld ищет boost_system.

Вы можете изменить имя_установки с помощью install_name_tool или использовать

-dylib_file имя_установки: имя_файла

опция для ld, которая является просто способом указать ld, что всякий раз, когда он сталкивается с путем install_name, соответствующим части аргумента перед двоеточием, он должен фактически получить эту библиотеку из пути после двоеточия.

Я думаю, что новые версии ld теперь уважают -L для косвенных зависимостей на Mac, но я не уверен. Я использовал только 10.4, у которого был ld, игнорирующий -L для косвенных зависимостей, и я использовал -dylib_file, чтобы избавиться от множества фантомных явных зависимостей, которые другие люди вставили, чтобы обойти ту проблему, которую вы описываете!

1 голос
/ 14 января 2009

Если boost_filesystem использует символы из boost_system (а ваше приложение - нет) и сама ссылается непосредственно на boost_system для их разрешения, она должна просто работать. Проблемы плоских и двухуровневых пространств имен обычно возникают, когда вы ожидаете, что символы, предоставляемые зависимостью библиотеки, с которой вы ссылаетесь, будут доступны в вашем приложении.

Если boost_filesystem не связывается с boost_system (otool -L скажет вам), то у вас мало возможностей - если не считать перепривязки - кроме добавления ручной зависимости от boost_system.

Правильно ли я считаю, что boost не использует GNU libtool (он обрабатывает межбиблиотечные зависимости правильным для вас способом, специфичным для платформы)? Если это так, то это может быть простой обходной путь.

...