【问题标题】:Make - nothing to be done for all (another one)Make - 所有人都无事可做(另一个)
【发布时间】:2013-06-07 21:27:35
【问题描述】:

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

我使用 MinGW,在我的目录中我有 Res.defRes.hRes.cppRes.o,这是我在运行 g++ -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

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

【问题讨论】:

  • 您似乎没有.o 文件的规则。
  • @KerrekSB:是的,抱歉,请看更新
  • 我没看到。 Res.o 仍然没有规则。
  • @KerrekSB:呵呵,好的,我已经更新了)

标签: c++ dll makefile


【解决方案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 $<

【讨论】:

  • Ehhh... 是的,看起来像.. 你对 obj 文件是正确的.. 请查看更新..
  • 编译完.cpp、Res.o还是Res.obj后有哪个文件?此文件应在 .dll 依赖项中指定,并且还必须有关于如何从该目标文件生成 .dll 的规则或命令。规则 .obj.dll: 告诉如何从 .obj 生成 .dll。如果您的文件是Res.o,则应将.obj.dll: 替换为.o.dll:。或者只是在 'Res.dll: ...' 依赖项之后的行中指定链接命令(并且不要忘记在命令之前进行 TAB 缩进)。
  • 如果我手动运行g++ -shared Res.o,我会创建一个a.exe 文件。但我想这只是一个错误命名的dll。当我查看二进制内容时,我看到了那里的所有功能,但它们无法从外部访问,因为我想我在创建过程中没有使用 Res.def 文件。它是 25kb 对 125kb 的原始 dll,我猜因为 *.lib 文件不存在。所以,我尝试make .o.dll,它出现了找不到libc.lib kernel32.lib user32.lib的错误。我的MinGW中没有这样的库......我找不到下载它们的地方......跨度>
  • 好吧,我在 MinGW 安装中找到了 libuser32.alibkernel32.a。我想我必须使用它们。但是没有找到 libc.lib 的替代品。
  • 您尝试调整的 Makefile 看起来像是为 MS Visual Studio 编写的(您将拥有“LINK”命令和所有这些库)。对于 MinGW,适当的链接命令是 gcc -o Res.dll -shared Res.o(无需指定 libc、kernel32 和 user32 库)。 MinGW 不使用 .DEF 文件从 DLL 导出函数;相反,您应该使用__declspec(dllexport) 说明符(如extern "C" __declspec(dllexport) int __stdcall MyPublicFunction(int, int);)在源代码(通常在头文件中)声明函数。事实上,MinGW 在很多方面与 MS Visual Studio 不同。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多