1

Make 说它与所有人无关。我已经在互联网上搜索过,它说这件事的情况有几十种。虽然没有任何解决方案有帮助......

我使用 MinGW,在我的目录中,我有,Res.def和运行后得到的.Res.hRes.cppRes.og++ -c Res.cpp

这是生成文件:

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++ 时,我完全不擅长制作文件,因此我试图在对代码进行一些更改后重新组装一个开源 dll。我已经阅读了有关构建 C 应用程序的信息,但它并没有太大帮助。原始的make文件有OBJS不同的行,它是

OBJS = Res.obj

OBJS = Res.o当试图以某种方式设法构建 dll 时,我已将其更改为。所以原始文件是:

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吗?我完全迷路了。在我看来,对于从单个源文件构建库这样简单的任务来说,这些复杂性有点过头了......?

4

1 回答 1

1

看起来您$(OBJS)的目录中已经有最新的了,而且对于all.

链接通常涉及多个目标文件,因此更传统的做法是为每个二进制文件明确指定链接规则:

Res.dll: $(OBJS) Res.def
      link ...

(请注意,Res.dll 不直接依赖于 .h 和 .cpp)。

但当然,您可以指定一个规则来从 .o 文件构建 .dll 文件。我想这就是你想要做的,但你的 Makefile 只有一个规则,用于从.obj文件(不是.o)构建 .dll 文件。

还有一件事:Res.o文件应该依赖于 Res.cpp 和 Res.h。所以你需要类似的东西:

Res.o: Res.h

.cpp.o:
      g++ -c $<
于 2013-06-07T21:38:54.317 回答