【问题标题】:How to get object file to link first?如何让目标文件首先链接?
【发布时间】:2021-02-10 16:30:11
【问题描述】:

我正在尝试为最初用于 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 放在库之后。

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

【问题讨论】:

  • 对象库不起作用,因为如果我将对象文件作为源文件提供,我会收到有关使用相对路径的投诉,如果我尝试使用属性IMPORTED_LOCATION,它似乎被忽略了,因为没有真正发生.但是,在阅读有关此属性的文档时,我确实注意到 UNKNOWN 库可以使用它。我试过了,它奏效了!所以感谢你让我走上正确的道路!

标签: visual-c++ cmake


【解决方案1】:

@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 是否可以解决我原来的问题的问题。不幸的是,它没有。但这是另一个问题......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2012-01-31
    • 2012-12-19
    相关资源
    最近更新 更多