我们有一些与间接依赖关系的链接问题。从我在网上看到的内容猜测可能是因为两级命名空间的使用。 当我们链接到boost库时,就会发生这种情况,精确地说boost_filesystem,它本身依赖于boost_system。链接器不解析boost_filesystem和boost_system之间的依赖关系。 有人能给我一些提示如何解决这个问题吗?手动将boost_system添加到依赖项感觉很难看,而且,它在其他平台上运行良好。
答案 0 :(得分:2)
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对Mac的间接依赖,但我不确定。我只使用10.4有一个忽略-L的ld用于间接依赖,我使用-dylib_file来摆脱其他人为了解决你描述的问题而放入的许多幻影显式依赖!
答案 1 :(得分:1)
如果boost_filesystem正在使用来自boost_system的符号(而你的应用程序不是),并且它本身直接与boost_system链接以解决它们,它应该可以工作。当您期望由您链接的库的依赖项提供的符号在您的应用程序中可用时,平面与两级命名空间问题通常会出现问题。
如果boost_filesystem没有链接到boost_system(otool -L会告诉你),那么除了在boost_system上添加一个手动依赖之外,你几乎没有选择重新链接它。
我是否正确认为boost不使用GNU libtool(它以正确的平台特定方式处理库间依赖关系)?如果是这样,那可能是一个简单的解决方法。