从另一个C文件调用函数

从另一个C文件调用函数,c,compiler-construction,linker,C,Compiler Construction,Linker,我正在使用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 = `p

我正在使用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) 
#ifndef MAIN_H
#define MAIN_H

extern void drawPolygonLine();

#endif  /* MAIN_H */
文件夹中的C/C++文件是main.cpp、assignment1gui.C和shadertools.C。我还有两个头文件-assignment1gui.h和shadertools.h。如前所述,我使用assignment1gui.h文件声明了新函数“drawPolygonLine();”

补充: “drawPolygonLine();”的声明现在位于“main.h”中,如下所示:

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) 
#ifndef MAIN_H
#define MAIN_H

extern void drawPolygonLine();

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

函数中使用的所有变量在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);
}

我希望这能说明问题。

问题在于此make文件不理解
main.cpp
,因为它只用于
.cc
.c
文件。我怀疑main.o没有被构建——或者,更可能的是,由于编译失败,还有另一个名为
main.c
main.cc
的文件,它包含在您的程序中,但没有在其中定义
drawPolygonLine()

要解决这个问题:

  • 删除或重命名任何现有的
    main.c
    main.cc
    文件

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

  • 如果你的程序是C++程序,你可以尝试将扩展名改为> cc,但是我怀疑你会遇到问题,因为你使用的是<代码> GCC 而不是<代码> G++< /C>。在这种情况下,我也会改变:

    CXX = gcc
    

    请记住,虽然很多C代码也是有效的C++代码,但是有很多细微的差别,最好的做法在每种语言中都有很大的不同。因此,<强>最好把C和C++当作不同的语言来处理。<强> < /P>
    如果这不能解决问题:

    • 检查头文件中声明的
      drawPolygonLine()
      函数签名是否与主文件中的定义方式相同。检查这些声明是否与您调用它的方式匹配
    • 检查调用
      drawPolygonLine()
      的文件是否包含
      #顶部的“assignment1gui.h”
    • 检查
      drawPolygonLine()
      是否未声明为
      static
      (静态函数在其翻译单元外不可见-因此链接器在一起编译两个输出文件时不会看到它们)

    另外,在头文件中有函数声明是一种很好的做法,它对应于它在中定义的源文件-因此,如果您想从
    assignment.c
    调用
    main.c
    中的函数,您通常会将声明放在
    main.h
    中,和
    #将它包含在
    作业.c
    的顶部。这不是您遇到的问题的原因,但这是一个很好的习惯做法。

    您是通过cpp文件调用c函数,还是通过cpp文件调用c函数?你得到的错误是什么?为什么你说有问题?问题在哪里?您是否收到了特定的错误消息?请将您的代码放入文件夹,然后运行
    make
    (只需一个单词,然后按enter键)。它应该编译你的代码。让我们知道在那之后得到什么错误信息(包括任何相关的C++或C文件)。使用<代码> GCC < /C> >而不是<代码> G++<代码>编译C++代码至少是一种传统的方法。它可能有用,但可能不应该。使用<代码> G++</代码>编译C++;使用
    gcc
    编译C(我指的是CXX宏),但您确实需要向我们显示您遇到的错误。检查
    drawPolyOnline
    是否在
    main.C
    中声明为
    static
    CXX = g++