如何解决如何让目标文件先链接?
我正在尝试为最初用于 Unix 平台的代码编译 Windows DLL。我遇到的一个问题是 Windows fopen()
默认为 O_TEXT
,但 Unix 默认为 O_BINARY
。
Windows 推荐了两种方法来解决这个问题:
后者适用于我自己的代码,但它似乎不适用于第三方静态库。查看链接器输出,我可以看到静态库包含在 binmode.obj
之前,但 binmode.obj
包含在我自己的目标文件之前。
真正的解决方案应该是说服所有外部库都包含 binmode.obj
,但这有点不重要,将来可能会产生大量维护开销。
所以我想尝试将 binmode.obj
移到链接器命令行的开头,但事实证明这非常困难。我试过了:
-
target_link_libraries( mylib PRIVATE binmode.obj )
- 位置正确,但由于链接器错误而重命名为binmode.obj.lib
。 - 尝试使用
binmode.obj
作为预编译对象制作静态库,但得到文件具有相对路径的错误。我不知道如何使它成为完整路径。 - 尝试以不同方式将其添加为链接器标志,甚至包括使用工具链文件,但最终都将
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 举报,一经查实,本站将立刻删除。