2014-04-18 55 views
0

我可能從根本上誤解MinGW g ++。exe/ld.exe的「-static」選項,但是我的目標是使用包含靜態而非必需的庫來構建我的項目動態的,這樣我就可以運送我的可執行文件(.exe),而不需要大量的dll。帶有「-static」選項的MinGW G ++鏈接失敗

我的版本是:

gcc version 4.6.2 (GCC) 
GNU ld (GNU Binutils) 2.22 

我找遍了所有周圍在過去的五年時間(包括https://sourceware.org/binutils/docs/ld/Options.html#Options & http://www.mingw.org/和計算器),並且似乎無法排序了這一點(但我已經做了類似建立在Visual C++我是很新,MinGW的,並沒有生成文件語法下來冷又對不起)

這裏是我的makefile:。

#Makefile: main.cpp 
CC = g++ 
GCR = glib-compile-resources 
GCR_SRC_FLAGS = --generate-source 
GCR_HDR_FLAGS = --generate-header 

LIBPATH = -L C:/MinGW/lib -L C:/MinGW/GTK3/lib 
LIBS = -lgdi32 -lkernel32 -luser32 -lws2_32 -lgtk-3.dll -lgdk-3.dll 
CFLAGS = -Wall -mwindows -Wl,-static 
#check for invalid symbols: https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html#id-1.6.3.3.3 
CFLAGS += -DGTK_DISABLE_SINGLE_INCLUDES 
#disable deprecated symbols 
CFLAGS += -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED 

#main: main.o theme.o theme.gresource.xml $(shell $(GCR) --generate-dependencies theme.gresource.xml) 
# $(GCR) $(GCR_SRC_FLAGS) theme.gresource.xml 
# $(GCR) $(GCR_HDR_FLAGS) theme.gresource.xml 
# -Wl,-whole-archive -Wl,-no-whole-archive 
main: main.o theme.o theme.gresource 
    $(CC) $(CFLAGS) $(LIBPATH) main.o theme.o -o main $(LIBS) `pkg-config gio-windows-3.0` `pkg-config gtk+-3.0 --cflags --libs` `pkg-config gdk-3.0 --cflags --libs` 
main.o: main.cpp main.h 
    $(CC) $(CFLAGS) $(LIBPATH) -c main.cpp -o main.o $(LIBS) `pkg-config gio-windows-3.0` `pkg-config gtk+-3.0 --cflags --libs` `pkg-config gdk-3.0 --cflags --libs` 
theme.o: theme.c 
    $(CC) $(CFLAGS) $(LIBPATH) -c theme.c -o theme.o $(LIBS) `pkg-config gio-windows-3.0` `pkg-config gtk+-3.0 --cflags --libs` `pkg-config gdk-3.0 --cflags --libs` 
theme.gresource: theme.gresource.xml $(shell $(GCR) --generate-dependencies theme.gresource.xml) 
    $(GCR) $(GCR_SRC_FLAGS) theme.gresource.xml 
    $(GCR) $(GCR_HDR_FLAGS) theme.gresource.xml 
clean: 
    rm -f *.o main 

如果我從「CFLAGS」變量中刪除「-Wl,-static」,代碼就會生成並執行正常。 但隨着「輪候冊,-static」在內,我得到以下錯誤:

$ make 
g++ -Wall -mwindows -Wl,-static -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -L C:/MinGW/lib -L C:/MinGW/GTK3/lib -c main.cpp 
-o main.o -lgdi32 -lkernel32 -luser32 -lws2_32 -lgtk-3.dll -lgdk-3.dll `pkg-config gio-windows-3.0` `pkg-config gtk+-3.0 --cflags --libs` `pkg-config gdk-3.0 - 
-cflags --libs` 
g++ -Wall -mwindows -Wl,-static -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -L C:/MinGW/lib -L C:/MinGW/GTK3/lib -c theme.c 
-o theme.o -lgdi32 -lkernel32 -luser32 -lws2_32 -lgtk-3.dll -lgdk-3.dll `pkg-config gio-windows-3.0` `pkg-config gtk+-3.0 --cflags --libs` `pkg-config gdk-3.0 - 
-cflags --libs` 
g++ -Wall -mwindows -Wl,-static -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -L C:/MinGW/lib -L C:/MinGW/GTK3/lib main.o them 
e.o -o main -lgdi32 -lkernel32 -luser32 -lws2_32 -lgtk-3.dll -lgdk-3.dll `pkg-config gio-windows-3.0` `pkg-config gtk+-3.0 --cflags --libs` `pkg-config gdk-3.0 
--cflags --libs` 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lgtk-3 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lgdk-3 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lfreetype 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lcairo-gobject 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lgdk-3 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lfreetype 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lcairo-gobject 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 

我不相信這意味着很多,但作爲一個測試,我補充說:「-lgtk-3.dll -lgdk- 3.dll「添加到我的」LIBS「變量中,並且當我這樣做(使用」.dll「後綴)時,它們不會觸發錯誤。如果我省略「.DLL」,我得到與其他人一起列出的錯誤,即附加實例:

c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lgtk-3 
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot find -lgdk-3 

這兩個庫添加爲測試存在於我的GTK/lib目錄爲:libgtk-3。 dll.a和libgkd-3.dll.a

我誤解了一些至關重要的東西,或者使用了不正確的語法?都?任何想法都非常感謝。謝謝!

回答

1

當您想要進行靜態鏈接時,您需要這些庫的靜態版本。

在這裏,您需要gtk-3,gdk-3,freetype等的靜態版本。

通常他們被稱爲libgtk-3.alibgdk-3.a ...

+0

感謝您的答覆。我意識到這可能是api dll的傻瓜差事。我看了一下GIMP,發現他們分發了所有的dll,所以這些都必須爲我工作。 – artifizz

+0

你們可以告訴我有沒有辦法識別圖書館是靜態還是動態鏈接,以避免這樣的問題或能夠識別它們? – starach