制作 - 没有什么可以为所有人(另一个)做

时间:2013-06-07 21:27:36

标签: c++ dll makefile

说它与所有人无关。我在搜索互联网时有很多情况。虽然这些解决方案都没有帮助......

我使用MinGW,在我的目录中我有Res.defRes.hRes.cppRes.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这样一个简单的任务来说,这些复杂性似乎有点过头了....?

1 个答案:

答案 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 $<