我正在尝试为最初用于Unix平台的代码编译一个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放在库之后。。
我现在没有想法了,我觉得我需要帮助。有什么建议怎么解决吗?
发布于 2021-02-11 07:54:33
@fabian的评论让我阅读了CMake文档的正确部分,这让我意识到可以使用未知的库类型。使用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是否可以修复我原来的问题。不幸的是没有。但这是另一个问题..。
https://stackoverflow.com/questions/66140916
复制相似问题