微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让目标文件先链接?

如何解决如何让目标文件先链接?

我正在尝试为最初用于 Unix 平台的代码编译 Windows DLL。我遇到的一个问题是 Windows fopen() 认为 O_TEXT,但 Unix 认为 O_BINARY。 Windows 推荐了两种方法解决这个问题:

  1. 使用 _set_fmode() 函数,对我不起作用,可能是因为我无法从正确的上下文中调用它。
  2. binmode.obj 对象文件链接。此文件包含在编译器中,编译器知道在哪里查找它。

后者适用于我自己的代码,但它似乎不适用于第三方静态库。查看链接输出,我可以看到静态库包含在 binmode.obj 之前,但 binmode.obj 包含在我自己的目标文件之前。 真正的解决方案应该是说服所有外部库都包含 binmode.obj,但这有点不重要,将来可能会产生大量维护开销。 所以我想尝试将 binmode.obj 移到链接器命令行的开头,但事实证明这非常困难。我试过了:

  1. target_link_libraries( mylib PRIVATE binmode.obj ) - 位置正确,但由于链接错误重命名binmode.obj.lib
  2. 尝试使用 binmode.obj 作为预编译对象制作静态库,但得到文件具有相对路径的错误。我不知道如何使它成为完整路径。
  3. 尝试以不同方式将其添加链接器标志,甚至包括使用工具链文件,但最终都将 binmode.obj 放在库之后。

我现在没有想法,觉得我需要帮助。有什么建议可以解决这个问题吗?

解决方法

@fabian 的评论让我读到了 CMake 文档的正确部分,这让我意识到可以使用 UNKNOWN 库类型。在 CMake 中使用以下代码我可以让 binmode.obj 出现在所有库之前:

add_library( binmode_obj UNKNOWN IMPORTED GLOBAL )
set_target_properties( binmode_obj PROPERTIES IMPORTED_LOCATION binmode.obj )
target_link_libraries( mylib PUBLIC binmode_obj )

这解决了我在库可能解决我原来的问题之前尝试链接 binmode.obj 的问题。不幸的是,它没有。但这是另一个问题...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。