【发布时间】:2021-02-10 16:30:11
【问题描述】:
我正在尝试为最初用于 Unix 平台的代码编译 Windows DLL。我遇到的一个问题是 Windows fopen() 默认为 O_TEXT,但 Unix 默认为 O_BINARY。
Windows 推荐两种方法来解决这个问题:
- 使用
_set_fmode()函数,可能对我不起作用,可能是因为我无法从正确的上下文中调用它。 - 与
binmode.obj目标文件链接。该文件包含在编译器中,编译器知道在哪里查找它。
后者适用于我自己的代码,但它似乎不适用于第三方静态库。查看链接器输出,我可以看到静态库包含在 binmode.obj 之前,但 binmode.obj 包含在我自己的目标文件之前。
真正的解决方案应该是说服所有外部库包含binmode.obj,但这有点不重要,并且将来可能会产生大量的维护开销。
所以我想尝试将binmode.obj 移动到链接器命令行的开头,但事实证明这非常困难。我试过了:
-
target_link_libraries( mylib PRIVATE binmode.obj )- 位置正确,但重命名为binmode.obj.lib导致链接器错误。 - 尝试使用
binmode.obj作为预编译对象制作静态库,但出现文件具有相对路径的错误。我不知道如何使它成为一条完整的路径。 - 尝试以不同方式将其添加为链接器标志,甚至包括使用工具链文件,但最终都将
binmode.obj放在库之后。
我现在没有想法,觉得我需要帮助。有什么建议可以解决这个问题吗?
【问题讨论】:
-
对象库不起作用,因为如果我将对象文件作为源文件提供,我会收到有关使用相对路径的投诉,如果我尝试使用属性
IMPORTED_LOCATION,它似乎被忽略了,因为没有真正发生.但是,在阅读有关此属性的文档时,我确实注意到UNKNOWN库可以使用它。我试过了,它奏效了!所以感谢你让我走上正确的道路!
标签: visual-c++ cmake