Linker MinGW G++;链接到-“静态”;期权失败

Linker MinGW G++;链接到-“静态”;期权失败,linker,g++,mingw,static-libraries,ld,Linker,G++,Mingw,Static Libraries,Ld,我可能从根本上误解了MinGW g++.exe/ld.exe的“-static”选项,但我的目标是在构建项目时将必要的库作为静态库而不是动态库,这样我就可以在没有大量DLL的情况下发布可执行文件(.exe) 我的版本是: gcc version 4.6.2 (GCC) GNU ld (GNU Binutils) 2.22 我在过去的五小时里搜索了所有的(包括&和StAcExpLoad),并且似乎无法解决这个问题(但是我在VisualC++中已经做了类似的构建。我对MinGW来说是新的,而且没有

我可能从根本上误解了MinGW g++.exe/ld.exe的“-static”选项,但我的目标是在构建项目时将必要的库作为静态库而不是动态库,这样我就可以在没有大量DLL的情况下发布可执行文件(.exe)

我的版本是:

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

我在过去的五小时里搜索了所有的(包括&和StAcExpLoad),并且似乎无法解决这个问题(但是我在VisualC++中已经做了类似的构建。我对MinGW来说是新的,而且没有MaFig文件语法,但现在还很冷。抱歉) 这是我的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
我不认为这意味着什么,但作为一个测试,我在我的“LIBS”变量中添加了“-lgtk-3.dll-lgdk-3.dll”,当我这样做时(使用“.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


我是否误解了一些重要的事情,或者使用了错误的语法?二者都任何想法都非常感谢。谢谢

当您想要进行静态链接时,需要这些库的静态版本

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


通常称为
libgtk-3.a
libgdk-3.a
,…

谢谢您的回复。我意识到这对于api dll来说可能是一件愚蠢的差事。我看了一下GIMP,发现他们在安装时分发了所有的dll,所以这对我来说是可行的。你们能告诉我有什么方法可以识别库是静态链接的还是动态链接的,以避免类似的问题,或者能够识别它们吗?