Ubuntu18.10下用Makefile编译OpenCV4.0出现未定义引用错误求助
解决Makefile编译OpenCV4时的Undefined Reference错误
你遇到的问题核心在于Makefile里没有正确执行pkg-config命令来获取OpenCV的编译链接参数。直接在Shell里执行g++命令时,Shell会自动解析$(pkg-config ...)并替换成实际的编译/链接参数,但在Makefile的语法里,这种写法不会触发Shell命令执行,导致你的LIBS变量实际上是空的——编译时没链接OpenCV的库,自然会出现函数未定义的引用错误。
修复后的Makefile
把原来的OPENCV变量赋值改成用$(shell)包裹Shell命令,让Make主动执行pkg-config并获取正确参数:
CC = g++ CFLAGS = -W -Wall SRCS = main.cpp TARGET = simple # 用$(shell)执行pkg-config命令,获取OpenCV的编译和链接参数 OPENCV = $(shell pkg-config opencv4 --libs --cflags) LIBS = $(OPENCV) $(TARGET):$(SRCS) $(CC) $(CFLAGS) -o $(TARGET) $(SRCS) $(LIBS) clean: rm -f $(OBJECTS) $(TARGET) core
为什么原来的写法失效?
在Makefile中,普通变量赋值VAR = $(pkg-config ...)里的$(pkg-config ...)会被当成Make自身的变量引用,而非Shell命令。Make找不到名为pkg-config的内部变量,所以这个变量会被替换成空字符串。必须用$(shell ...)语法明确告诉Make:这是一条需要执行的Shell命令,要把命令的输出结果作为变量值。
验证效果
修改后执行make,你会看到编译命令和你直接在Shell里执行的完全一致:
g++ -W -Wall -o simple main.cpp [此处会显示pkg-config输出的所有OpenCV参数]
这样就能正确链接OpenCV的库,解决未定义引用的问题了。
内容的提问来源于stack exchange,提问作者KJS_999
相关产品推荐
相关产品推荐

