MinGW G ++链接" -static"选项失败

时间:2014-04-18 18:24:16

标签: linker g++ mingw static-libraries ld

我可能从根本上误解了MinGW g ++。exe / ld.exe的“-static”选项,但我的目标是使用必要的库来构建我的项目,包括静态而不是动态,以便我可以运送我的可执行文件(。 exe)没有多少dll。

我的版本是:

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/和stackoverflow),似乎无法解决这个问题(但我已经完成了类似的构建) Visual C ++。我是MinGW的新手,并且还没有冷却makefile语法。抱歉。)

这是我的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”,则代码构建并执行正常。 但是如果包含“-Wl,-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 个答案:

答案 0 :(得分:1)

如果要进行静态链接,则需要这些库的静态版本。

在这里,您需要静态版本的gtk-3,gdk-3,freetype等。

通常他们被称为libgtk-3.alibgdk-3.a,...