2012-11-30 35 views
5

Używam mingw gcc i msys do zbudowania wielu narzędzi GNU. W przeszłości miałem wiele problemów spowodowanych przez różne pliki wykonywalne wymagające różnych wersji libiconv, więc aby uniknąć problemu chciałem statycznie połączyć iconv z plikami wykonywalnymi.Jak statycznie połączyć iconv w oknach przy użyciu msys?

Zbudowałem libiconv używając mingw i msys z configure --enable-static. Tworzy to bibliotekę DLL, bibliotekę importu .dll.a i zwykłą bibliotekę statyczną .a.

Jednak, gdy próbuję zbudować inny program, który łączy się z prostym -liconv, otrzymuję link DLL. Zakładam, że ld jest z jakiegoś powodu woli bibliotekę importu od biblioteki statycznej (nie jest to zły wybór w ogólnie, jest to szczególny przypadek).

Jak mogę zapewnić, że programy, które buduję, są statycznie połączone? Jednym z oczywistych podejść jest po prostu usunięcie pliku .dll.a podczas wykonywania kompilacji. Jest to prawdopodobnie najprostsza opcja, ale jestem ciekawa - czy istnieje flaga linkera, którą mogę ustawić (przez coś podobnego do LDFLAGS), aby wymusić ładowanie iconv statycznie (najlepiej, bez wpływu na inne biblioteki, ale w mgnieniu oka byłbym OK z ładowaniem wszystkich bibliotek statycznie)

Odpowiedz

1

Masz rację, domyślnie ma zamiar połączyć "udostępniony", chyba że powiesz mu, żeby łączył statycznie. Można to zrobić na kilka sposobów, w zależności od tego działa dla Ciebie

make CC='gcc -static' 
make LDFLAGS=-static 
make LDFLAGS=libiconv.a 

Wystarczy spojrzeć na Makefile i znaleźć jak najmniej szkodliwy sposób, aby dopasować je.

Example

+0

przypuszczalnie pierwszych dwóch połączy * wszystko * statycznie, podczas gdy trzeci tylko łączy statycznie iconv (i inne biblioteki, takie jak zlib, będą nadal linkować do biblioteki dll). –

+0

Lub '-Wl, -Bstatic, -liconv' –