Dołączanie kodu z bibliotek DLL

0

Czołem.

Mam sobie bibliotekę .dll. Chciałbym przekazać linkerowi taką wiadomość: "drogi linkerze, mam u siebie na komputerze bibliotekę .dll. Na maszynie, na której uruchomię aplikację, tej biblioteki nie będzie, więc weź kod z tej dll'ki i na sztywno wpisz go do kodu wykonywalnego programu". Jak to zrobić?

Chodzi mi konkretnie o bibliotekę pthreadGC2 do MinGW.
Mam sobie plik, który najpierw kompiluję:

g++ -Wall thread.cpp -c -o thread.o
potem go linkuję:
g++ -static-libgcc -static-libstdc++ -othread.exe thread.o -lpthreadGC2
Dodatkowo w folderze, w którym jest kod, jest również ta dll.
I - gdy uruchamiam na innej maszynie - dostaję: "This application has failed to start because pthreadGC2.dll was not found. Re-installing the application may fix this problem."

Z gory dziękuję za pomoc

0

W uproszczeniu? Nie da się, dll to pełnoprawny plik wykonywalny, nie obiekt linkera.

Jak naprawdę chcesz się bawić to możesz np. spróbować któregoś z konwerterów, PE COFF zawiera dość informacji żeby coś, co się do linkowania nadaje wygenerować (w praktyce i dll i obj to format PE COFF). Inna (pewniejsza) opcja to skorzystać z MoleBoksa lub innego bindera, np. DLLPackager autorstwa ReWolfa.

0

Codziennie coś nowego. W międzyczasie odkryłem, ze można po prostu dllkę położyć w katalogu programu, albo gdzieś obok (pewnie można linkerowi to podpowiedzieć) i działa, a załączanie dllek z programem mnie nie boli.

Dziękuję bardzo.
[edit]
Jeszcze jedno pytanie: w jaki sposób można powiedzieć linkerowi, żeby zapisał, że dllki nie będą w katalogu, w którym jest program, ale np. w podkatalogu "libdll"?

0

Nie linkerowi to musisz mówić, tylko programowi. Jeśli to biblioteka to bez kombinowania umarł w butach, a na kombinowaniu się nie znam.

0

Nie do końca rozumiem.
Znaczy - wiadomo, że docelowo to program ma wiedzieć, gdzie ma szukać tych bibliotek. Niemniej jednak ja linkując - z opcją -l (?) - podaję info, że takie biblioteki będą dołączane dynamicznie i trzeba ich gdzieś szukać. Program szuka ich domyślnie w katalogu bieżącym - a ja chciałbym te pliki schować gdzieś do osobnego podkatalogu, żeby był porządek - dlatego pytam, bo nie wiem, co podać linkerowi.

0

Może czegoś nie wiem, ale raczej funkcje z DDLki wywołuje się przez system a nie bezpośrednio. Jeśli kod wywołujący nie jest twój tylko w bibliotece to możesz sobie pomarzyć o zmianie ścieżki DLLki.

0

Olo, system tylko rozwiązuje zależności przy inicjalizacji, funkcje z bibliotek wołane są bezpośrednio przez programy. Co do zmiany ścieżki to nie mam pojęcia co masz na myśli... 'Mówienie programowi, nie linkerowi' to też jakiś absurd, za strukturę aplikacji odpowiedzialny jest właśnie linker.

0

A pliki .local? Poza tym, ścieżkę bezwzględną można wymusić twa tworząc dll (lub edytując nazwę w sekcji eksportu za pomocą edytora binarnego), ale to raczej bug moim zdaniem a nie funkcja która jest do czegoś przydatna. Czy ścieżkę wzgledną można wymusić w ten sam sposób - nie wiem bo nie próbowałem.

0

deus, ja widziałem funkcję do wywoływania DLLek - sprawdzę to dokładnie, ale wyglądało to jak funkcja pośrednicząca właśnie systemowa odpowiedzialna za wywołanie DLLki. Jeśli się mylę, to sorki za wprowadzenie w błąd.

0

Część kompilatorów posiada biblioteki importów, które udostępniają stuby wskakujące po prostu do funkcji systemowych, część woła bezpośrednio z importów, system nie jest do niczego potrzebny.

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