Biblioteki .dll w plikach .exe ?

0

Witam
Uczę się c++, ostatnio próbuje coś robić w zakresie tworzenia GUI, a to tego są potrzebne frameworki. Próbuje winapi ale jest dość trudno, a co gorsza wiedza w Internecie jest śladowa na ten temat. Dużym plusem wymienionego framworka jest to że generuję tylko jeden plik .exe który potrzebuje jedynie tego co oferuje windows do uruchomienia. Chciałbym spróbować coś porobić w innym narzędziach typu sdl2, wxwidgets. Czy da się zrobić plik .exe w którym będą skompilowane te biblioteki, z tego co wiem biblioteki .dll są już skompilowane, chodzi po prostu o to żeby był tylko jeden plik .exe ?

3

To, z definicji, nie chcesz linkować dynamicznie do biblioteki (DLL stoi od Dynamic-Link Library), tylko chcesz kompilować statycznie. Zobacz, czy licencja tego, co linkujesz, na to pozwala, i przestaw odpowiednie opcje w systemie budowania, z którego korzystasz.

3

@plugan300:

Olbrzymia większość libek GUI ma wariant w postaci bilbioteki *.LIB tylko poszukać - a to co chcesz zrobić, sie nazywa statyczne linkowanie.
Nie ma potrzeby gwałcić DLL

Althorion napisał(a):

To, z definicji, nie chcesz linkować dynamicznie do biblioteki (DLL stoi od Dynamic-Link Library), tylko chcesz kompilować statycznie. Zobacz, czy licencja tego, co linkujesz, na to pozwala, i przestaw odpowiednie opcje w systemie budowania, z którego korzystasz.

W szczególności Qt utrudnia licencyjne (przynajmniej biznesowe) użycie statycznie linkowanych wersji.
Faktem jest, że generalnie w o.s. jest licencja LGPL, która preferuje DLL (nie zmusza do włączenia swojego kodu pod GPL) , ale poza Qt inne raczej nie podkładają świń.

2

Naucz się rozpoznawać rzeczy mało ważne,
żeby nie zawracać sobie nimi głowy

A co to komu przeszkadza że jest EXE + DLL a nie jedno EXE ?

Widziałem takie cudo że EXE rozpakowywało do TEMP DLL i używało takiej biblioteki.

W aplikacji 32-bitowej można było też umieścić DLL w zasobach a potem użyć funkcji ale do użycia Qt albo wxwidgets raczej to nie przejdzie

Jako twórca dystrybuujesz oprogramowanie i dodajesz zależności do paczki
Aby było łądniej możesz zrobić EXE w ROOT-FOLDER a wszystkie DLL w "ROOT-FOLDER/lib"

0

Jeżeli chodzi o SDL2 i wxWidgets (mingw pod windowsem) to przy instalacji bibliotek jest tam dodatkowo konfigurator sdl2-config i wx-config, który zwraca parametry dla kompilatora, wywołanie wygląda tak:

g++ -o main sdl2_test.cpp `sdl2-config --cflags --static-libs` -lglew32 -lopengl32 -lglu32
g++ -o main wx_test.cpp `wx-config --cflags --libs --static`

tak skompilowany program nie potrzebuje już bibliotek SDL2 i wxWidgets, ale może się pluć o inne np. libstdc++-6.dll, libgcc_s_seh-1.dll, libpng16.dll, etc. Żeby się ich pozbyć trzeba dać dodatkowe flagi -static -static-libstdc++ -static-libgcc. Niektóre biblioteki wymagają innych zabiegów, np. GLEW przed includowaniem nagłówka potrzebuje zdefiniowane makro GLEW_STATIC, żeby biblioteka zlinkowała się statycznie:

#define GLEW_STATIC
#include <glew.h>

Poniżej wszystkie opcje dla programów z SDL2 i wxWidgets, które generują exec-i o naprawdę sporych rozmiarach:

g++ -o main sdl2_test.cpp `sdl2-config --cflags --static-libs` -lglew32 -lopengl32 -lglu32 -static -static-libgcc -static-libstdc++
g++ -o main wx_test.cpp `wx-config --cflags --libs --static` -static -static-libstdc++ -static-libgcc

dla testów uruchomiłem konsole cmd, wyczyściłem PATH (set PATH="") i programy uruchomiły się bez pytania o DLL-ki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1