You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:22:03