加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

如何在Linux或Macos中为Windows编译静态.lib库

发布时间:2020-12-14 01:06:01 所属栏目:Linux 来源:网络整理
导读:我正在寻找在 Linux或Macos中为Windows编译静态库的方法,似乎有交叉编译器为Windows生成.a库,如 this one,但这不是我想要的,我想要的是.lib静态库文件for Windows,最好是Visual Studio.我知道我可以运行Windows虚拟机并使用Visual Studio,但这太重了,无法在
我正在寻找在 Linux或Macos中为Windows编译静态库的方法,似乎有交叉编译器为Windows生成.a库,如 this one,但这不是我想要的,我想要的是.lib静态库文件for Windows,最好是Visual Studio.我知道我可以运行Windows虚拟机并使用Visual Studio,但这太重了,无法在命令行中完成.

解决方法

对于类似Unix的操作系统(Linux,MacOS等),静态库意味着
一个 ar archive的目标文件. ar是GNU将军
目的档案.它并不关心您将哪种文件存入存档.它的
当它们碰巧是目标文件时,只是将它称为“静态库”的自定义.和
它也只是一个被称为* .a的ar存档的自定义.你可以打电话给它
* .lib,或任何东西.

对于Visual Studio,静态库表示PE格式对象文件的存档
通常由Microsoft工具LIB创建.

Microsoft LIB存档的格式实际上与Unix ar存档的格式相同.微软
很久以前就采用了它.

所以如果你使用你的发行版的PE交叉编译器在Linux上编译一些PE目标文件
然后将它们存档到带有ar的* .lib中,你已经拥有了一个非常适合Windows的静态库
使用Visual Studio编译器.

好吧,只要这些目标文件具有C二进制接口,就可以了.
如果它们中的任何一个具有C接口,则它们是无用的:Microsoft和GCC C编译器使用不同的名称修改协议,否则ABI不兼容.

演示

我们在linux中开始使用静态库的一些源代码:

你好?

#include <stdio.h>

void hello(void)
{
    puts("Hello world");
}

交叉编译:

$x86_64-w64-mingw32-gcc-win32 -o hello.obj -c hello.c

制作静态库:

$ar rcs hello.lib hello.obj

然后一个程序将与hello.lib链接:

main.c中

extern void hello(void);

int main(void)
{
    hello();
    return 0;
}

现在我们跳进一个Windows 10 VM,我们正在查看我们的文件
刚刚通过共享文件夹创建:

E:developsoxstatlib>dir
 Volume in drive E is VBOX_imk
 Volume Serial Number is 0000-0804

 Directory of E:developsoxstatlib

03/12/2017  18:37                72 main.c
03/12/2017  18:29               978 hello.lib
03/12/2017  18:26                66 hello.c
03/12/2017  18:27               832 hello.obj
               4 File(s)          1,948 bytes
               0 Dir(s)  153,282,871,296 bytes free

编译并链接我们的程序:

E:developsoxstatlib>cl /Fehello.exe main.c hello.lib
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.c
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello.exe
main.obj
hello.lib

运行:

E:developsoxstatlib>hello
Hello world

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读