gpt4 book ai didi

从另一个 C 文件调用函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:13 25 4
gpt4 key购买 nike

我正在使用 OpenGL 在 C/C++ 中编写图形程序。我有一堆 .c 文件,现在,我正在尝试从 assignment1gui.c 中的 main.cpp 调用一个函数。老师给了我一个编译代码的文件。它看起来像这样:

OBJS   = assignment1gui.o shadertools.o main.o
TARGET = ass1

CXX = gcc

DBFLAGS = -O0 -g3 -ggdb3 -fno-inline

WFLAGS = -Wall -ansi
GLFLAGS = `pkg-config --cflags gtk+-2.0`
LGLFLAGS = `pkg-config --libs gtk+-2.0` -lGL -lGLEW -lGLU -lglut

CXXFLAGS = $(WFLAGS) $(DFLAGS) $(GLFLAGS)
LDFLAGS = -export-dynamic -lXext -lX11 $(LGLFLAGS)


all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)

.SUFFIXES: .cc
.cc.o:
$(CXX) -c $(CXXFLAGS) $<
.c.o:
$(CXX) -c $(CXXFLAGS) $<
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LDFLAGS)

我尝试调用的函数是“drawPloygonLine()”。我已经在“assignment1gui.h”中声明了它,正如我之前提到的,定义在 main.cpp 中。

看了网上的各种帮助,发现编译代码肯定有问题。但我不确定。有人可以帮帮我吗?

抱歉,我之前遗漏了这部分。我得到的错误是:

assignment1gui.o: In function `on_btn_color_color_set':
assignment1gui.c:(.text+0x1c): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_line_toggled':
assignment1gui.c:(.text+0x8b): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_circle_toggled':
assignment1gui.c:(.text+0xfc): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_rect_toggled':
assignment1gui.c:(.text+0x16d): undefined reference to `drawPolygonLine'
assignment1gui.o: In function `on_rb_tool_edit_toggled':
assignment1gui.c:(.text+0x24a): undefined reference to `drawPolygonLine'
collect2: ld returned 1 exit status
make: *** [ass1] Error 1

我在文件夹中的 C/C++ 文件是 main.cpp、assignment1gui.c 和 shadertools.c。我还有两个头文件 - assignment1gui.h 和 shadertools.h。正如我之前提到的,我使用 assignment1gui.h 文件来声明新函数“drawPolygonLine();”

添加:“drawPolygonLine();”的声明现在在“main.h”中,它看起来像这样:

#ifndef MAIN_H
#define MAIN_H

extern void drawPolygonLine();

#endif /* MAIN_H */

main.cpp 和 assignment1gui.c 的开头都有“#include “main.h””。 drawPolygonLine() 的定义是:

void drawPolygonLine()
{
if(option[opCount-1]==4 && drawn==false)
{
vCount++;
vertex[vCount].x=A;
vertex[vCount].y=B;
lines=lines+2;
vCount++;
vertex[vCount].x=polyX;
vertex[vCount].y=polyY;
clicks=0;
drawn=true;
}

}

函数中使用的所有变量在main.cpp中都是全局的。

我如何调用 drawPolygonLine() 的示例;在 assignment1gui.c 中是这个函数:

void on_btn_color_color_set(GtkColorButton *colorbutton, gpointer user_data)
{
drawPolygonLine();

GdkColor color;
gtk_color_button_get_color(colorbutton, &color);
printf("Color set rgb=(%i,%i,%i)\n",color.red,color.green,color.blue);
}

我希望这能说明问题。

最佳答案

问题是 main.cpp 不能被这个 make 文件理解,因为它只有 has rules对于 .cc.c 文件。我怀疑 main.o 没有被构建——或者更可能的是,因为你已经达到编译失败的程度,所以还有另一个名为 main.cmain 的文件。 cc 包含在您的程序中,但其中没有定义 drawPolygonLine()

解决这个问题:

  1. 删除或重命名任何现有的 main.cmain.cc 文件。

  2. 如果您的程序实际上是 C 程序,则将文件名更改为 main.c

  3. 如果您的程序是 C++ 程序,您可以尝试将扩展名更改为 .cc,但我怀疑您随后会遇到问题,因为您使用的是 gcc 而不是 g++。在这种情况下,我也会更改:

    CXX = gcc

    CXX = g++

请记住,虽然很多 C 代码也是有效的 C++ 代码,但它们之间存在许多细微差别 - 每种语言的最佳实践也大不相同。因此,最好将 C 和 C++ 视为不同的语言。


如果这不能解决问题:

  • 检查头文件中声明的drawPolygonLine() 函数签名是否与主文件中定义的方式相同。检查这些声明是否与您调用它的方式相匹配。
  • 检查调用 drawPolygonLine() 的文件是否在顶部有 #include "assignment1gui.h"
  • 检查 drawPolygonLine() 没有被声明为 static(静态函数在它们的翻译单元之外是不可见的——所以链接器在编译时不会看到它们两个输出文件在一起)

此外,最好在头文件中声明与定义它的源文件相对应的函数声明 - 因此,如果您想从 assignment 调用 main.c 中的函数.c,你通常会将声明放在main.h中,并将它#include放在assignment.c的顶部.这不会是您遇到的问题的原因,但习惯是一种很好的做法。

关于从另一个 C 文件调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10134959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com