【问题标题】:Cross compile with i686-w64-mingw32-g++ and use main() as entry point与 i686-w64-mingw32-g++ 交叉编译并使用 main() 作为入口点
【发布时间】:2020-09-30 14:33:10
【问题描述】:

我正在使用普通的g++ 为我的linux 可执行文件在一个make 目标中为Linux 编译,并在一个单独的make 目标中使用i686-w64-mingw32-g++ 为windows 编译。如果我使用 main(),g++ 目标会构建,而 windows 目标会失败:

./build/i686-w64-mingw32-i686-w64-mingw32-crt/./mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain@16'

Similar question

我尝试了上面链接中的两种解决方案,但都没有奏效。

这是我的 windows 构建目标:

RayCaster1.cpp SDLWrapper.cpp -I/usr/local/i686-w64-mingw32/include -L/usr/local/i686-w64-mingw32/lib -lmingw32 -lSDL2 -lSDL2_ttf -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic -o testWindows.exe

添加 -mwindows 或 -Wl,-subsystem,windows 并没有解决我的问题。我试着一次把其中一个放在最后,开始,中间。我的 windows 构建目标变得非常臃肿,我是不是用另一个标志来烦它?

这是我的主要功能:

int main(int /*argc*/, char */*argv*/[])
{
    SDLWrapper sdlWrapper;

    initRasterPixels();
    sdlWrapper.setupSDLRenderer(WINDOW_WIDTH, generateRaster);
    return 0;
};

【问题讨论】:

  • 你真的有main函数吗?发布Minimal Reproducible Example 和确切的构建命令会改善问题
  • 通常你不应该把那些包含和库路径;如果编译器安装正确,它会默认在那里搜索(但也许你有一个特殊的安装)
  • 是的,我有一个这样的函数: int main(int /*argc*/, char */*argv*/[]) 如果我将它更改为 WinMain,那么我的窗口会使目标工作并且我有一个 Windows 可执行文件
  • 另外你不应该使用-mwindows,这意味着要寻找WinMain
  • @M.M 我可能需要修改我的路径来简化我的构建命令,我很高兴能够让交叉编译工作。我的 linux 构建目标更短更干净,只是 g++ RayCaster1.cpp SDLWrapper.cpp -lSDL2 -lSDL2_ttf -o test.exe

标签: makefile cross-compiling main mingw-w64 winmain


【解决方案1】:

使用-mconsole 代替-mwindows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多