从另一个C文件调用函数
我正在使用OpenGL用C/C++编写一个图形程序。我有一堆.c文件,现在,我正试图从assignment1gui.c中的main.cpp调用一个函数。老师给了我一个包含编译代码的文件。看起来是这样的:从另一个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
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
文件main.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++