clinker

Calling a function from another C file


I am writing a graphics program in C/C++ using OpenGL. I have a bunch of .c files and right now, I am trying to call a function from main.cpp in assignment1gui.c. The teacher has given me a file with the compile code. It looks like this:

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) 

The function I am trying to call is "drawPloygonLine()". I have declared this in "assignment1gui.h", and the definition, as I mentioned earlier, is in main.cpp.

From all the help on the Internet, I realized that there must some problem with the compile code. But I am not sure. Could someone please help me out?

Sorry I left out this part earlier. The errors I am getting are:

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

The C/C++ files I have in the folder are main.cpp, assignment1gui.c and shadertools.c. I also have two header files- assignment1gui.h and shadertools.h. As I have mentioned earlier, I used the assignment1gui.h file to declare the new function "drawPolygonLine();"

Addition: The declaration of the "drawPolygonLine();" is now in "main.h" and it looks like this:

#ifndef MAIN_H
#define MAIN_H

extern void drawPolygonLine();

#endif  /* MAIN_H */

Both main.cpp and assignment1gui.c have "#include "main.h"" at their beginning. The definition of drawPolygonLine() is:

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;
    }

}

All the variables used in the function are global in main.cpp.

An example of how I am calling drawPolygonLine(); in assignment1gui.c is in this function:

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);
}

I hope this makes it clear.


Solution

  • The problem is that main.cpp isn't understood by this make file, since it only has rules for .cc or .c files. I suspect that main.o isn't being built - or, more likely, since you're getting as far as a failed compile, there is another file called main.c or main.cc which IS included in your program, but doesn't have drawPolygonLine() defined in it.

    To solve this:

    1. Remove or rename any existing main.c or main.cc files.

    2. If your program is actually a C program, then change the filename to main.c

    3. If your program is a C++ program, you could try changing the extension to .cc, but I suspect you'll then run in to problems since you're using gcc rather than g++. In this case, I'd also change:

      CXX = gcc
      

      to

      CXX = g++
      

    Remember that although a lot of C code is also valid C++ code, there are many subtle differences - and the best practices are very different in each language. For this reason, it's best to treat C and C++ as different languages.


    If this doesn't fix it:

    Also, it's good practice to have the function declaration in the header file corresponding to the source file it's defined in - so if you want to call a function in main.c from assignment.c, you would usually put the declaration in main.h, and #include it at the top of assignment.c. This won't be the cause of the problem that you're having, but it's good practice to get used to.