未定义的引用linux makefile中的函数

时间:2014-01-27 16:32:57

标签: c++ makefile fltk

我在linux上进行make编译时出现问题....获取有关未定义引用的错误。 简而言之,我们使用GUI设计师FLUID。 FLUID的代码在MyProjectGUI类中。我在FLUID之外写了一个回调函数,它是从MyProjectGUI的函数中调用的。

MyProjectGUI.h 包含回调函数头: #include "students/stu_callbacks.h" MyProjectGUI.cxx

#include "MyProjectGUI.h"
....
void MyProjectGUI::somecallback_i([args])
{   ...
   brandNewCallback();
    ...
}

在“students / stu_callbacks.h ”中:

#include "../main_utils.h"
void brandNewCallback();

然后在“students / stu_callbacks.cpp ”中:

#include "stu_callbacks.h"
void brandNewCallback() 
{  ...stuffs...
}

Makefile 我用过:

VXLDIR = [....]

CFLAGS = [...VXL header paths...] -Wno-deprecated -DJPEG_LIB_VERSION=80

CC = g++

#fltk library paths and libraries
FLTKLDFLAGS = -L/local/lib -L/usr/lib/x86_64-linux-gnu/ -Wl,-rpath,/local/lib -lfltk_gl -lGLU -lGL -lfltk -L/usr/X11R6/lib -lpthread -lm -lXext -lX11 -lsupc++

#vxl library paths and libraries
VXLLDFLAGS = -L$(VXLDIR)/bin/lib -lvil -lvnl_algo -lvnl_io -lvnl -lv3p_netlib -lvcl -lvul -lpng -ltiff -lopenjpeg2 -lgeotiff
LDFLAGS = -lstdc++ $(FLTKLDFLAGS) $(VXLLDFLAGS)

FLUID = fluid

%.o: %.cxx
    $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

%.cxx: %.fl
    $(FLUID) -c $<

BASIC_OBJ   = gl/glutils.o gl/Texture.o main.o file/load_image.o

IMDRAW_OBJ  = [...imdraw...]

UI_OBJ      = MyProjectUI.o

UI_CPP      = MyProjectUI.cxx MyProjectUI.h

GRAPHIC_OBJ = graphics/graphics.o

STUDENT_OBJ = graphics/graphics_algorithm.o

imdraw-code/myproject:  $(UI_CPP) $(BASIC_OBJ) $(UI_OBJ) $(STUDENT_OBJ) $(GRAPHIC_OBJ) $(IMDRAW_OBJ)

    $(CC) -o ../bin/viscomp $(BASIC_OBJ) $(UI_OBJ) $(GRAPHIC_OBJ) $(IMDRAW_OBJ) $(STUDENT_OBJ) $(LDFLAGS)
  • 在大学Linux下使用此Makefile进行编译会从MyProjectGUI.cxx获取有关函数“brandNewCallback()”的未定义引用的错误。请注意,它没有抱怨没有找到“students / stu_callbacks.h”,因此应该阅读标题。
  • 完全相同的代码使用Visual Studio编译时没有问题。
  • 这个结构类似于Makefile中列出的“file / load_image”,(“load_image”函数是从MyProjectGUI中调用的,包含的设置非常相似)......但是那个不会导致任何问题。
  • 尝试将“students / stu_callbacks.o”添加到Makefile中的“STUDENT_OBJ”,然后我在找不到“main_utils.h”中包含stud_callbacks.h的内容时遇到致命错误,这根本没有意义。其他文件源“main_utils.h”没有问题。
  • 尝试将func调用为::brandNewCallback();,仍然是同样的错误。
  • 最直接的解决方法是将所有这些回调代码放在MyProjectGUI中......

我不明白我怎么也不能让它像它一样工作,而且它会破坏我的黑客行为。昨晚我已经花了5个小时尝试/谷歌搜索...所以任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的规则%.o: %.cxx指示制作如何编译扩展名为.cxx的源文件。但是,你的 自己的C ++源文件是students/stu_callbacks.cpp。您没有提供规则来从.cpp文件中创建目标文件,或者从students / stu_callbacks.cpp文件中创建目标文件。因此,您的stu_callbacks没有被链接,并且链接器自然会抱怨。

头文件的问题类似 - C ++编译器可能没有包含路径集。