从另一个C文件调用函数

时间:2012-04-13 03:44:07

标签: 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  = `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);
}

我希望这说清楚。

1 个答案:

答案 0 :(得分:2)

问题是此make文件无法理解main.cpp,因为.cc.c文件只有has rules。我怀疑main.o没有被构建 - 或者更可能的是,因为你得到了一个失败的编译,还有另一个名为main.cmain.cc的文件包含在你的文件中程序,但没有定义drawPolygonLine()

解决这个问题:

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

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

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

    CXX = gcc
    

    CXX = g++
    
  4. 请记住,虽然很多C代码也是有效的C ++代码,但是存在许多细微差别 - 并且每种语言的最佳实践都有很大不同。出于这个原因,最好将C和C ++视为不同的语言。


    如果这不能解决问题:

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

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