C++ (C+;+;)在linux上为windows编译时如何使用库?

C++ (C+;+;)在linux上为windows编译时如何使用库?,c++,linux,windows,mingw,cross-compiling,C++,Linux,Windows,Mingw,Cross Compiling,我已经可以使用x86\u 64-w64-mingw32-g++交叉编译一些简单的应用程序了。但是,我无法找到如何为我的项目找到库(在我的例子中,我需要使用SDL2和SDL2_image)。我已经知道如何安装这些库(sudo apt install libsdl2 dev libsdl2 image dev),但是apt search没有显示任何用于x86\u 64-w640mingw32-g++的库 以下是我看过的链接: 有没有一种方法可以使用预编译库,或者我需要在我的项目中添加源代码 更新

我已经可以使用
x86\u 64-w64-mingw32-g++
交叉编译一些简单的应用程序了。但是,我无法找到如何为我的项目找到库(在我的例子中,我需要使用SDL2和SDL2_image)。我已经知道如何安装这些库(
sudo apt install libsdl2 dev libsdl2 image dev
),但是
apt search
没有显示任何用于
x86\u 64-w640mingw32-g++
的库

以下是我看过的链接:

有没有一种方法可以使用预编译库,或者我需要在我的项目中添加源代码

更新:我按照Laurent Jospin的指示,可以编译一个与Windows一起工作的“Hello World”程序(我把它发送给一个朋友进行测试)。但是,我无法编译使用SDL的程序

终端输出:

$ /opt/mxe/usr/bin/x86_64-w64-mingw32.shared-g++ -O3 main.o Game.o TextureManager2D.o Map.o Entity.o Player.o -mwindows -lSDL2 -lSDL2_image -o ../../../endeavour-client.exe
/opt/mxe/usr/lib/gcc/x86_64-w64-mingw32.shared/5.5.0/../../../../x86_64-w64-mingw32.shared/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function `main':
/opt/mxe/tmp-gcc-x86_64-w64-mingw32.shared/gcc-5.5.0.build_.crt/../gcc-5.5.0.build_/mingw-w64-v8.0.0/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2: error: ld returned 1 exit status
$

-mwindows
更改为
-municode
-d UNICODE
-Wl,-子系统,windows
,或将其删除都不起作用。

您要查找的是M交叉环境:

它是一组makefiles,可以下载和交叉编译linux上windows的流行库。默认情况下,它会构建静态库,这样您最终会得到一个合并到final.exe中的.a库,这意味着您不必担心应用程序附带DLL。但是,如果您喜欢模块化结构,它还可以构建一些DLL


他们提供的图书馆名单令人印象深刻。另一方面,如果缺少库,您仍然可以通过复制相应的头文件和DLL来安装它。在某些特定情况下,您可能需要交叉编译一个依赖项(我必须对使用ruby脚本的应用程序进行交叉编译。ruby的官方windows版本与使用mingw构建的某些库不兼容。但这是非常特殊的)。

正确的命令是:

$ /opt/mxe/usr/bin/x86_64-w64-mingw32.shared-g++ -O3 main.o Game.o TextureManager2D.o Map.o Entity.o Player.o -mwindows -lmingw32 -lSDl2main -lSDL2 -lSDL2_image -o ../../../endeavour-client.exe
编辑:请注意,
-lmingw32-lSDL2main-lSDL2-lSDL2_image
的准确顺序至关重要

一、 我是个十足的白痴,忘了在命令中包含
-lmingw32
-lSDL2main
标志,这就是为什么找不到WinMain的问题。当使用MinGW-w64作为交叉编译器时,必须包括
-lmingw32
库。当然,在为windows构建时,SDL需要
-lSDl2main
标志(但有趣的是,不是在Linux上)。这里是我使用的链接。(我对用
-lSDL2main
替换
-lSDLmain
有一个不同寻常的见解,因为链接非常旧。)


买一个装有windows的便宜硬盘可能会更快更简单。这是可能的,但我没有能力也没有钱买。那就忘掉windows,继续在Linux上编码吧。顺便说一句,我从1974年开始编码,从未使用过Windows。如果你买不起窗户(我也买不起),就不要用它。如果你的老板或客户需要Windows,他必须向你支付Windows许可证。在大多数国家,使用一些免费的Windows是非法的(因此你可能会遇到法律麻烦或被罚款)。顺便说一句,你可能对这个项目感兴趣(Linux上的符号AI,自由软件)。然后通过电子邮件联系我至
basile@starynkevitch.net请朋友从你的C++代码中编译他自己的Windows计算机上的Windows变体,并发给他一些C++代码,这些代码对LinuxThanks来说是有用的。当我能测试答案时,我会接受的。