【问题标题】:Make: Prioritize -L (or: Ignore contents delivered by pkg-config)Make:优先级 -L(或:忽略 pkg-config 传递的内容)
【发布时间】:2021-08-19 21:16:55
【问题描述】:

我想make一个依赖于其他库的库。

我已经能够make 依赖的静态.a 文件,并将它们与头文件一起放在目录中随时可用。通过file 运行它们确认我已经成功地为所有架构编译了这些。

当我尝试制作最终库时,它会告诉我

ld: warning: ignoring file /usr/local....dylib, building for architecture-A but attempting to link with file built for architecture-B

正确的是,上述路径下的库仅针对主机架构 A 编译(通过包管理器安装)。但是,在LDFLAGS 我有-L${libdir}/libs(库所在的文件夹),但make 似乎只关心我的usr/local/..文件夹中的那些。

是否有其他方法可以专门指向 make 以检查 {libdir}/libs 文件夹,或者甚至让 make 忽略来自 pkg-config 的路径,以防它首先在那里搜索,找到不合适的文件并且永远无法尝试我在LDFLAGS 中传递的那些?

【问题讨论】:

    标签: makefile pkg-config


    【解决方案1】:

    你写...

    我已经能够制作依赖项的静态 .a 文件,并将它们与头文件一起放在目录中随时可用。

    ...但这可能无关紧要,因为您似乎正在尝试构建 shared(即动态)库。静态库和共享库不能很好地混合。

    是否有其他方法可以专门指向 make 以检查 {libdir}/libs 文件夹,或者甚至让 make 忽略来自 pkg-config 的路径,以防它首先在那里搜索,找到不合适的文件并且永远无法尝试我在LDFLAGS 中传递的那些?

    您关注的是make,但make 与它没有太大关系。执行搜索和实际链接的是链接器,而不是makemake 只是执行你告诉它执行的链接命令。

    但是是的,您可以通过控制其命令行选项的顺序来控制链接器的库搜索顺序。通过-L 选项指定的库目录将按照它们在命令行中出现的顺序进行搜索,并且所有这些目录都在链接器的默认库目录之前。* 如果确保参数的正确顺序无法满足您的要求您想要的链接很可能是因为链接器忽略了您的静态库,因为它正在尝试构建动态库。

    但是,您应该能够通过指定要链接的库的完整路径和文件名来完全绕过搜索,而不是使用-L-l 选项。例如,您可以使用/path/to/libfoo.dylib(或/path/to/libfoo.a)代替-L/path/to -lfoo。您通常不希望对这样的路径进行硬编码,但在这种情况下,这样做可能会起到诊断的作用。

    另请注意,链接到未安装在其预期位置的动态库很少是一个好主意,特别是如果这些库不是同一项目的一部分。乍一看似乎可以正常工作,但它会导致在运行时查找库时出现问题(并且也需要在运行时查找动态库)。这同样不适用于静态库,但它有其自身的优点和缺点。


    * 不止于此,但这个答案已经很长了。如果您想了解更多详细信息,请阅读链接器文档。

    【讨论】:

    • 感谢您关于输入完整路径的提示,我意识到链接器实际上确实看到了 .a 文件。结果是其中一个包产生了多个库 - 一旦我在再次构建依赖项时考虑到这一点,它就不会对“最终”库造成进一步的麻烦。顺便说一句,所有静态的,如果你的意思是动态.so,则没有动态。关于你的陈述——这里推荐的做事方式是什么?安装软件包只会让我知道我的系统架构 - 你如何让链接器指向例如源文件,所以我不
    • 必须在编译我真正需要的库之前编译目标架构的所有依赖项?有没有办法设置 make/link/build 以便它浏览和编译依赖项的源文件并在构建最终库之前构建它们,而不是期望 lib 文件夹中的编译依赖项?比如,从源代码构建依赖项而不是访问它们的编译状态?
    • @user2161301,您在问题中提供的错误消息提到了一个以dylib 结尾的库。这是 Mac 命名共享(又名动态)库的约定。如果您认为您只构建静态库,那么有些东西就不会加起来。但如果您确实只构建静态库和可执行文件,那么链接这些库的唯一问题就是找到它们。
    • 至于只构建您需要的架构,构建系统为构建主机的本机架构以外的任何东西进行构建是非常不寻常的,尤其是在没有明确要求的情况下所以。构建系统在单个构建中针对多个体系结构进行编译的情况更为罕见。如果您正在与做这些奇怪事情的项目合作,那么您需要针对这些特定项目量身定制的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2021-10-19
    • 2019-07-14
    • 2015-04-16
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多