我在 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/