c++ - 未定义对 linux makefile 中函数的引用

标签 c++ makefile fltk

我在 Linux 上进行编译时遇到问题...。出现有关 undefined reference 的错误。 简而言之,我们使用 GUI 设计器 FLUID。 FLUID 中的代码位于 MyProjectGUI 类中。我在 FLUID 之外写了一个回调函数,它是从 MyProjectGUI 的函数内部调用的。

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

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

在“学生/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 中调用的,包含的设置非常相似)......问题。
  • 尝试在 Makefile 中将“students/stu_callbacks.o”添加到“STUDENT_OBJ”,然后出现 fatal error ,即未在 stud_callbacks.h 的“main_utils.h”包含中找到包含,这根本没有意义。其他文件来源“main_utils.h”没有问题。
  • 尝试将函数调用为 ::brandNewCallback();,仍然是同样的错误。
  • 直接的解决方法是将所有这些回调代码放在 MyProjectGUI 中...

我不明白我怎么不能让它正常工作,这让我很困惑。昨晚我已经花了 5 个多小时尝试/谷歌搜索...所以非常感谢任何帮助!

最佳答案

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

头文件的问题与此类似——C++ 编译器可能没有设置包含路径。

关于c++ - 未定义对 linux makefile 中函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21386244/

相关文章:

c++ - FLTK 框元素在窗口中不可见

c++ - 使用 Cmake 的 RelWithDebInfo 作为默认构建类型

C++如何使用相同的类和方法来读取/写入可变大小的数据

c++ - 由于未定义对 'deflateEnd' 的引用,无法使用 GCC 构建 C 应用程序

c++ - 强制 FLTK 在没有事件句柄的情况下重绘

c - AC_CHECK_LIB 与 fltk

c++ - SIMULINK 模型的 C/C++ 包装器

c++ - 运算符<<重载

C 未定义对 `some_foo' 的引用

c++ - 我如何使用 make 来维护一个通用的 C++ 头文件包含目录?