LINUX.ORG.RU
решено ФорумGames

Кросскомпиляция mingw , статическая линковка SDL2

 , , ,


0

1

Попробовал тут под винду собрать проект, обламался. Думаю надо что-то простое собрать и проверить. Cуть в том что не работает статическая компиляция

Ну и делаю так собираю библиотеку, её подключает простая программка и ещё она подлючает ещё SDL2. Из библиотеки для теста просто в консоль чиселко, а SDL рисует треугольник

Собирается всё так

CC=x86_64-w64-mingw32-gcc
AR=x86_64-w64-mingw32-ar
LFLAGS= -lmingw32 
CFLAGS= -fPIC

makelib:
	$(CC) -c lib.c -o lib.o
	$(AR) rcs lib.a lib.o
	$(CC) -shared lib.o -o lib.dll

makeapp:
	$(CC) -c app.c -o app.o -I./include
	$(CC) app.o lib.a -L./ -lSDL2  -o app.exe

makeappstatic:
	$(CC) -c app.c -o app.o -I./include
	$(CC) app.o lib.a  libSDL2.a  -o app.exe

lib.h

int lib(int x);

lib.c

#include "lib.h"

int lib(int x)
{
    return x+x;
}

app.c

#include <stdio.h>
#include "SDL2/SDL.h"

int WinMain(int argc, char* argv[])
{
    printf("%d\n",lib(50));

    if (SDL_Init(SDL_INIT_VIDEO) == 0) {
        SDL_Window* window = NULL;
        SDL_Renderer* renderer = NULL;

        if (SDL_CreateWindowAndRenderer(640, 480, 0, &window, &renderer) == 0) {
            SDL_bool done = SDL_FALSE;

            while (!done) {
                SDL_Event event;

                SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
                SDL_RenderClear(renderer);

                SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
                SDL_RenderDrawLine(renderer, 320, 200, 300, 240);
                SDL_RenderDrawLine(renderer, 300, 240, 340, 240);
                SDL_RenderDrawLine(renderer, 340, 240, 320, 200);
                SDL_RenderPresent(renderer);

                while (SDL_PollEvent(&event)) {
                    if (event.type == SDL_QUIT) {
                        done = SDL_TRUE;
                    }
                }
            }
        }

        if (renderer) {
            SDL_DestroyRenderer(renderer);
        }
        if (window) {
            SDL_DestroyWindow(window);
        }
    }
    SDL_Quit();
    return 0;
}


Ну и далее, тут всё нормально выводит 100 и окошко с треугольником

make makelib
make makeapp
wine app.exe

А вот если линкую статически libSDL.a то

make makelib
make makeapp
dron@gnu:~/egnaroc/wip/mingw$ make makeappstatic 
x86_64-w64-mingw32-gcc -c app.c -o app.o -I./include
x86_64-w64-mingw32-gcc app.o lib.a  libSDL2.a  -o app.exe
/usr/bin/x86_64-w64-mingw32-ld: libSDL2.a(SDL_windows.o): в функции «WIN_CoInitialize»:
/Users/valve/release/SDL/SDL2-2.0.10-source/foo-x64/../src/core/windows/SDL_windows.c:76: неопределённая ссылка на «__imp_CoInitializeEx»
/usr/bin/x86_64-w64-mingw32-ld: libSDL2.a(SDL_windows.o): в функции «WIN_CoUninitialize»:
/Users/valve/release/SDL/SDL2-2.0.10-source/foo-x64/../src/core/windows/SDL_windows.c:95: неопределённая ссылка на «__imp_CoUninitialize»
/usr/bin/x86_64-w64-mingw32-ld: libSDL2.a(SDL_windowskeyboard.o): в функции «IME_SetupAPI»:
...
...
# и так далее ld ругается, но,почему?

Если собирать


makeappstatic:
	$(CC) -c app.c -o app.o -I./include
	$(CC) app.o lib.a libSDL2.dll.a libSDL2.a  -o app.exe

То сборка проходит, но понятное дело wine требует SDL2.dll

P.S. Я не собираюсь по итогу всё статически собирать, в этом смысла особого нет пока что, но просто не пойму, почему ld то тугается

SDL2 отсюда https://www.libsdl.org/release/SDL2-devel-2.0.10-mingw.tar.gz понятное дело, пересобирать самому под mingw наверное смысла нету

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

Подсмотрел ldconfig, для статической сборки нужно так libSDL2.dll.a должен отсутствовать (удалите или переименуйте)

makeappstatic:
	$(CC) -c app.c -o app.o -I./include
	$(CC) app.o lib.a -L./ -lmingw32 -lSDL2main -lSDL2 -mwindows  -Wl,--no-undefined -Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid -static-libgcc -o app.exe


P.S. Так собирать приложения не надо, это плохо но для тестовых сборок может быть удобно вжарить всё в 1 бинарник

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от amaora

с LTO

Замедляющим скорость бинаря в некоторых случаях, благодаря какой-то внутренней кривизне gcc.

anonymous
()
Ответ на: комментарий от amaora

А почему не получилось? Там же только флаг -flto добавить и всё.

P.S. Я не собирал так, мне оно не нужно

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Я ждал уменьшения размера итогового бинаря, но уменьшения не произошло. Подробностей сейчас не помню, вероятно надо копать в систему сборки SDL и его зависимостей (у меня еще SDL_image и SDL_ttf были).

amaora ★★
()
Ответ на: комментарий от amaora

Жили без LTO и дальше жить будем =) На ПК не критично, не так уж сильно оно и помогает, а на всякие андроиды где это было бы оправданно и в целом хорошо, дружно обламываемся так как эти ироды требуют что бы мы использовали наипоследнейшую версию NDK где намаренно суют палки в колёсам заставляя использовать clang вместо gcc. Ну если мне приспичит я потестирую сборку с LTO чуть позже я всё равно приду к тому что мне надо собирать проект полностью из исходников ибо там и SDL2/net/image/mixer и Luajit уже с патчами, и всё это надо и под венду и под linux и под MacOSX кросскомпилить + отдельно всё это под уже андрюшу. Как доделаю и автоматизирую всю эту шнягу проверю уже с -flto как себя ведёт и выглядит если не забуду. Но это всё фигня, как кросс компилить под венду понял, остальное в мелочах (хотя есть и приколы не работает printf() при статик линковке lol) а вот как кросскомпилировать из под linux для Mac я зх, пойду тред создам , пока параллельно гуглю

LINUX-ORG-RU ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.