链接问题与Mac OS X上的间接依赖关系

问题描述:

我们有一些间接依赖关系的链接问题。从我在网上阅读的内容猜测,这可能是因为两层名称空间的使用。 这种情况发生在我们链接到boost库时,boost_filesystem就是精确的,而boost_filesystem本身依赖于boost_system。链接器不能解决boost_filesystem和boost_system之间的依赖关系。 有人可以给我一些提示如何解决这个问题吗?将boost_system手动添加到依赖关系会感到难看,另外,它在其他平台上工作正常。链接问题与Mac OS X上的间接依赖关系

如果boost_filesystem正在使用来自boost_system的符号(并且您的应用程序不是),并且它本身直接与boost_system进行链接来解决它们,它应该可以正常工作。当您希望在您的应用程序中提供由您链接的库的依赖关系提供的符号时,平面与双层命名空间问题通常会出现问题。

如果boost_filesystem没有链接到boost_system(otool -L会告诉你),那么除了在boost_system上添加手动依赖项之外,你没有任何选项可以重新链接它。

我是否正确思考boost不使用GNU libtool(它以正确的平台特定方式处理库间依赖关系)?如果是这样,那可能是一个简单的解决方法。

Mac上的某些版本的静态链接编辑器ld不通过-L选项解析间接依赖关系,而是通过install_name直接依赖关系查找它们。在boost_filesysten上运行otool -L将显示ld正在查找boost_system的位置。

您可以更改与install_name_tool的install_name的,或者您可以使用

-dylib_file install_name的:FILE_NAME

选项LD这仅仅是一个告诉LD的方式,每当遇到一个install_name的路径匹配冒号之前的参数部分,那么它实际上应该从冒号后的路径中获取该库。

我认为ld的较新版本现在对-L的间接依赖关系表示尊重,但我不确定。我只使用10.4有一个忽略了-L的间接依赖关系的ld,我使用了-dylib_file来摆脱其他人为了解决所描述的问题而放入的很多幻影显式依赖关系。