说它与所有人无关。我在搜索互联网时有很多情况。虽然这些解决方案都没有帮助......
我使用MinGW,在我的目录中我有Res.def
,Res.h
,Res.cpp
和Res.o
,这是我在运行g++ -c Res.cpp
之后得到的。
这是makefile:
CFLAGS = -c -G3 -GX -Od -W3 -Zi -D_X86_=1 -DWIN32 -D_WIN32 -nologo -DSTRICT
LFLAGS = -debug:mapped,full -debugtype:cv -nologo
LIBS = libc.lib kernel32.lib user32.lib
SRCS = Res.def Res.cpp Res.h
OBJS = Res.o
all: Res.dll
Res.dll: $(SRCS) $(OBJS)
$(SRCS):
co $(SRCS)
.cpp.obj:
cl $(CFLAGS) $*.cpp
.rc.rbj:
rc $*.rc
cvtres -i386 $*.res -o $*.rbj
.obj.dll:
link $(LFLAGS) -DLL -subsystem:windows -out:$*.dll \
-def:$*.def $(OBJS) $(LIBS)
.obj.exe:
link $(LFLAGS) -subsystem:console -out:$*.exe \
$*.obj $(EXELIBS)
如何制作dll?
更新
我来自Java,当我能理解C或C ++时,我是make文件的总菜鸟,因此我在尝试对代码进行一些更改后重新组装一个开源dll。我已经阅读了有关构建C应用程序的内容,但它没有多大帮助。原始make文件的OBJS
行不同,它是
OBJS = Res.obj
我试图以某种方式设法构建dll时将其更改为OBJS = Res.o
。所以原始文件是:
CFLAGS = -c -G3 -GX -Od -W3 -Zi -D_X86_=1 -DWIN32 -D_WIN32 -nologo -DSTRICT
LFLAGS = -debug:mapped,full -debugtype:cv -nologo
LIBS = libc.lib kernel32.lib user32.lib
SRCS = Res.def Res.cpp Res.h
OBJS = Res.obj
all: Res.dll
Res.dll: $(SRCS) $(OBJS)
$(SRCS):
co $(SRCS)
.cpp.obj:
cl $(CFLAGS) $*.cpp
.rc.rbj:
rc $*.rc
cvtres -i386 $*.res -o $*.rbj
.obj.dll:
link $(LFLAGS) -DLL -subsystem:windows -out:$*.dll \
-def:$*.def $(OBJS) $(LIBS)
.obj.exe:
link $(LFLAGS) -subsystem:console -out:$*.exe \
$*.obj $(EXELIBS)
使用该默认行,它说了另一件事:
*** No rule to make target `Res.obj`, needed by `Res.dll`. Stop.
请告诉我如何组装这个简单的dll?我完全迷失了。对于从单个源文件构建lib这样一个简单的任务来说,这些复杂性似乎有点过头了....?
答案 0 :(得分:1)
您的目录中似乎已经拥有最新的$(OBJS)
,all
实际上没有任何工作要做。
链接通常涉及多个目标文件,因此更明确地为每个二进制文件明确指定链接规则:
Res.dll: $(OBJS) Res.def
link ...
(请注意,Res.dll不直接依赖.h和.cpp。)
但是,您当然可以指定用于从.o文件构建.dll文件的规则。我想这就是你要做的,但你的Makefile只有一个规则,用于从 .obj 文件(不是 .o )构建.dll文件。< / p>
还有一件事:Res.o
文件应该依赖于Res.cpp和Res.h.所以你需要这样的东西:
Res.o: Res.h
.cpp.o:
g++ -c $<