【发布时间】:2018-02-16 21:53:40
【问题描述】:
目前我刚刚用 C 和 GTK + -3 创建了一个小软件,在我的机器上一切正常,但是当我在另一台笔记本电脑上测试该软件时 有几个引用 DLL 库的错误。 第一次尝试缺少 libglib-2.0-0.dll 库,然后是 libwinpthread-1.dll、libintl-8.dll、libiconv-2.dll、库,每当我添加到缺少的库时,都会出现一个新的缺少库。
我想知道是否有任何方法可以在编译时将库包含在可执行文件中?
我正在使用 mingw64.exe 进行构建,这是我当前的 makefile:
# Tools
CC=x86_64-w64-mingw32-gcc
LD=x86_64-w64-mingw32-gcc
CFLAGS=--std=c99 --pedantic -Wall -W -Wmissing-prototypes -g
LDFLAGS=
SGTKFLAGS=`pkg-config --cflags gtk+-3.0`
EGTKFLAGS=`pkg-config --libs gtk+-3.0`
# Files
EXEC=text_decoration
HEADERS=model.h view.h controller.h
MODULES=model.c view.c controller.c text_decoration.c
OBJECTS=model.o view.o controller.o text_decoration.o
# Commands
RM=rm
RMFLAGS=-f
# Start point
all:$(EXEC)
# Règle pour la génération de l'exécutable
text_decoration: $(MODULES) $(HEADERS)
$(CC) $(SGTKFLAGS) -g -o $(EXEC) $(MODULES) $(HEADERS) $(EGTKFLAGS)
clean:
$(RM) $(RMFLAGS) $(EXEC).exe
一时间我以为是用make命令编译的, 当我尝试使用命令 nmake 时,出现以下错误:
C:\msys64\home\Mooo\a>nmake
Microsoft (R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation. All rights reserved.
x86_64-w64-mingw32-gcc `pkg-config --cflags gtk+-3.0` -g -o text_decoration model.c view.c controller.c text_decoration.c model.h view.h controller.h `pkg-config --libs gtk+-3.0`
x86_64-w64-mingw32-gcc.EXE: error: `pkg-config: No such file or directory
x86_64-w64-mingw32-gcc.EXE: error: gtk+-3.0`: No such file or directory
x86_64-w64-mingw32-gcc.EXE: error: `pkg-config: No such file or directory
x86_64-w64-mingw32-gcc.EXE: error: gtk+-3.0`: No such file or directory
x86_64-w64-mingw32-gcc.EXE: error: unrecognized command line option '--cflags'
x86_64-w64-mingw32-gcc.EXE: error: unrecognized command line option '--libs'
NMAKE : fatal error U1077: 'C:\msys64\mingw64\bin\x86_64-w64-mingw32-gcc.EXE' : return code '0x1'
Stop.
【问题讨论】:
-
命令替换的反引号仅在 Bourne shell 中有效; nmake 通过 Windows 命令提示符运行所有内容,这不是 Bourne shell。您必须查看 nmake 或 cmd.exe 是否提供等效语法。如果您还使用 GNU make,它可能也使用 Windows 命令提示符,但使用 GNU make 的语法是
$(shell command arguments...)。 -
即使您正确构建了它,您仍然需要将可再发行的 DLL 与您的可执行文件打包在一起。首先,您必须确定所有依赖项。
-
一个简单的方法是构建一个
PIC/static/32bit应用程序。然后一切都将包含在应用程序中,这样(假设所有需要的外围设备都可用)可以在使用相同类型 CPU 的任何机器上运行 -
建议向
cflags宏添加更多标志。-WextraWconversion。注意这个-W关闭所有警告