我想要做的事情非常复杂,所以我真的很难,甚至试图正确解释所有问题,所以,请耐心等待^^并告诉我,如果您需要更多信息,我会privede它马上 .


我正在构建一个使用SDL2的跨平台库 - 还有一些东西 - 到目前为止,从linux我可以使用配置文件为linux,win32和win64编译 . (我使用的是make文件,但是无论如何都需要一个配置文件来构建不同的makefile,所以我决定将所有内容放入配置文件中,即使是gcc命令 - 我不认为这是一个问题但...谁知道^^) . 这个讨论“bash脚本VS makefile”对我来说非常有用,但这不是重点 .

这是编译库的代码片段:

makerfile_l2w()
{
    if [ $1 = "-64" ]; then
        local CC=x86_64-w64-mingw32-gcc
    elif [ $1 = "-32" ]; then
        local CC=i686-w64-mingw32-gcc
    fi

    local CFLAGS="-O3 -Wall -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration -Wmaybe-uninitialized"
    local PREPATH=".."
    #Path to the SDL, SDL_image and Lua includes and libs
    local SDL2INCLUDES="-I $PREPATH/SDL2/include"
    local SDL2LIBS="-L SDLlibs/ -lmingw32 -lSDL2main -lSDL2"
    local SDLIMAGE2INCLUDES="-I $PREPATH/SDL2/SDL_image"
    local SDLIMAGE2LIBS="-L$PREPATH/SDL2/4windows/SDL2_image/${1:1} -lSDL2_image"
    #LUAINCLUDES = -I $DS(PREPATH)/lua/
    #LUALIB = -L $DS(PREPATH)/lua/ -llua -lm
    #Where to put the compiled program
    local COMPILEPATH="$PREPATH/BINARIES"


    echo "Makefile for linux to windows ${1:1} bits..."
    for file in ./*.c
    do
        set -x
        $CC $CFLAGS $SDL2INCLUDES $SDLIMAGE2INCLUDES -fPIC -c $file $SDL2LIBS $SDLIMAGE2LIBS
        set +x
    done
    mv -v ./*.o $PREPATH/BINARIES/
    set -x
    $CC $CFLAGS $SDL2INCLUDES $SDLIMAGE2INCLUDES -shared $COMPILEPATH/*.o -o $COMPILEPATH/libNLF.dll $SDL2LIBS $SDLIMAGE2LIBS
    set +x
}

makerfile_l2w -32 #I'm calling it like this

PS . :我正在尝试将图书馆 Build 到32位,我还没有尝试过64,但我很确定我会遇到同样的问题 .

以下是SDL库目录的内容:
enter image description here

enter image description here

我不知道这是否是一个线索但是,当我在上面运行脚本时,我重申了这个警告:

警告:-fPIC被目标忽略(所有代码都与位置无关)[默认启用]

以下是此脚本为编译器生成的命令示例:

i686-w64-mingw32-gcc -O3 -Wall -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration -Wmaybe-uninitialized -I ../SDL2/include -I ../SDL2/SDL_image -fPIC -c ./NLF_animation.c -L ../SDL2/4windows/SDL2/32 -lmingw32 -lSDL2main -lSDL2 -L ../SDL2/4windows/SDL2_image/32 -lSDL2_image

以下是此脚本生成的用于构建dll的命令:

i686-w64-mingw32-gcc -O3 -Wall -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration -Wmaybe-uninitialized -I ../SDL2/include -I ../SDL2/SDL_image -shared ../BINARIES/NLF_animation.o ../BINARIES/NLF_error.o ../BINARIES/NLF.o ../BINARIES/NLF_osservice.o ../BINARIES/NLF_screen.o -o ../BINARIES/libNLF.dll -L ../SDL2/4windows/SDL2/32 -lmingw32 -lSDL2main -lSDL2 -L ../SDL2/4windows/SDL2_image/32 -lSDL2_image

之后,我将libNLF.dll文件复制到这里的目录中,我试图模拟使用我的库的程序,然后编译它 . 我也有一个脚本,但由于遇到了麻烦,我决定先手动编译 . 这是我正在使用的命令 .

i686-w64-mingw32-gcc -O3 -I ../../SDL2/include/ -I../../SDL2/SDL_image/ -I ../../NLF_SCR/ -c teste.c - o teste.o

它工作正常,.o文件显然是正确创建的...然后这个:

i686-w64-mingw32-gcc -Wl,-R -Wl, . / -O3 -I ../../SDL2/include/ -I ../../SDL2/SDL_image/ -I ../ . ./NLF_SCR/ teste.o main.c -o main.exe -L ./ -lNLF

这给了我错误:

/usr/lib/gcc/i686-w64-mingw32/4.8/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o ):nafunção'main':/ build / buildd / mingw-w64-3.1.0 / build / i686-w64 -mingw32-i686-w64 -mingw32-crt /.. / .. / mingw-w64-crt / crt /crt0_c.c:18:referênciainfininidapara`WinMain @ 16'collect2:错误:ld返回1退出状态

据我所知,Windows需要WinMain()(总是在窗口上)来为GUI应用程序做一些GUI工作 . 但是SDL_main.h应该照顾这个!因此,当我构建libNLF.dll时,它可能表明某些链接不正确

然后改为我的“int main()”为“int WinMain()”只是为了测试它,'因为即使它工作也不是我的解决方案,我需要应用程序尽可能便携 . 在这个改变后,它工作,但给了我这个警告:

警告:resolvendo _WinMain @16vínculopara_WinMain使用--enable-stdcall-fixup para desabilitar estes avisos使用--disable-stdcall-fixup para desabilitar estes fixups

我尝试用wine run,runnin“wine main.exe”测试它,但是这给了我很多这样的错误:

fixme:win:EnumDisplayDevicesW(L“\ . \ DISPLAY1”,0,0x61f98c,0x00000000),存根!

但我怀疑这个特定的消息是由于一些特定的葡萄酒,如缺少32位库或其他东西......

为了以防万一,这里是测试目录的方式:
enter image description here
我对于我需要运行最终应用程序的文件很困惑,决定将所有内容放在那里,当它最终工作时,我研究了^^

最后,问题!我究竟做错了什么?!如何摆脱这个WinMain()恼人的麻烦?