c++ - 使用 opencv 和 C++ 的链接器出现问题 - 未定义参考
问题描述
有几个类似的问题,但他们似乎都有不起作用的答案。
我已将 opencv4 安装到 Ubuntu 的映像上,并且我知道 opencv 文件已正确安装
$ pkg-config --cflags opencv
-I/usr/include/opencv
并有一个适当的 .cp 文件
/usr/local/lib/pkgconfig$ ls
gpr.pc grpc++.pc grpc++_unsecure.pc protobuf-lite.pc
grpc.pc grpc_unsecure.pc opencv4.pc protobuf.pc
但即使它全部安装正确,它也会给我这个错误。
~/neuralink/neuralink-image-service-prompt/proto$ make g++ -std=c++11 `pkg-config --cflags opencv protobuf grpc` -L/usr/local/lib `pkg-config --libs opencv protobuf grpc++` -Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed -ldl foo.cpp -o foo
/tmp/ccnfoOEl.o: In function `main':
foo.cpp:(.text+0x48): undefined reference to `cv::imread(cv::String const&, int)'
/tmp/ccnfoOEl.o: In function `cv::String::String(char const*)':
foo.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x4d): undefined reference to `cv::String::allocate(unsigned long)'
/tmp/ccnfoOEl.o: In function `cv::String::~String()':
foo.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
/tmp/ccnfoOEl.o: In function `cv::String::operator=(cv::String const&)':
foo.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()'
/tmp/ccnfoOEl.o: In function `cv::Mat::~Mat()':
foo.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'
/tmp/ccnfoOEl.o: In function `cv::Mat::release()':
foo.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'foo' failed
make: *** [foo] Error 1
有些人已经尝试回答类似的问题(例如Undefined reference to cv::imread(cv::String const&, int)和链接 opencv 库与 g++)但是这些没有帮助,因为用户没有将 opencv 添加到他们的makefile和我有。
这是我的make文件
LDFLAGS = -L/usr/local/lib `pkg-config --libs opencv protobuf grpc++`\
-Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed\
-ldl
CXX = g++
CPPFLAGS += `pkg-config --cflags opencv protobuf grpc`
CXXFLAGS += -std=c++11
GRPC_CPP_PLUGIN = grpc_cpp_plugin
GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`
all: foo
client: image.pb.o image.grpc.pb.o client.o
$(CXX) $^ $(LDFLAGS) -o $@
server: image.pb.o image.grpc.pb.o server.o
$(CXX) $^ $(LDFLAGS) -o $@
%.grpc.pb.cc: %.proto
protoc --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<
%.pb.cc: %.proto
protoc --cpp_out=. $<
clean:
rm -f *.o *.pb.cc *.pb.h client server
我写了一个仍然抛出错误的简单程序
#include <opencv2/opencv.hpp>
#include <stdio.h>
int main() {
cv::Mat frame = cv::imread("sylvania.png", cv::IMREAD_UNCHANGED);
printf("Image size is %i x %i\n", frame.rows, frame.cols);
}
一切似乎都编译得很好,但我不断收到这个链接器问题。当我在另一台计算机(我的 Mac)上编译它的价值时,我似乎没有遇到问题。我还有 gRPC 和 Protoc 文件,因为我需要它们用于项目,我只是没有使用这些文件作为示例,因为它们很长。
解决方案
我同意 Micka 的观点,这是我的一个项目的 Makefile:
CPPFLAGS=-g -Wall -I. -DDEBUG
LDFLAGS=-g
LDLIBS=-lopencv_core -lopencv_calib3d -lopencv_highgui -lopencv_imgproc -lopencv_stitching -lopencv_video
main: main.o AffineKalmanLP.o
g++ $(LDFLAGS) -o main main.o AffineKalmanLP.o $(LDLIBS)
main.o: main.cpp main.h
g++ $(CPPFLAGS) -c main.cpp
AffineKalmanLP.o: AffineKalmanLP.cpp AffineKalmanLP.h
g++ $(CPPFLAGS) -c AffineKalmanLP.cpp
clean:
rm main main.o AffineKalmanLP.o
您需要将其添加到LDLIBS
.
如果我删除该行,我也会得到各种未定义的参考。
推荐阅读
- java - 为什么这个插件(用于 minecraft java)不起作用?
- python - 如何在`with`上下文管理器中模拟sqlalchemy执行输出
- android - 在 safeArgs 中将 ArrayList 作为参数传递
- javascript - 莫里斯折线图:单击时获取点值
- excel - 在 EXCEL 中为每个第一列单元格查找第二列集的最后一个单元格值
- c - C: 我不知道“while(temp->next->next)”是什么意思
- apache-spark - Pyspark-将每个数据帧保存到一个文件中
- visual-studio - 在visual stdio 2019 C++中,我试图打开一个空的peject,但没有成功......?
- python - 一个C扩展类可以伪装成一个Python列表吗
- javascript - 使用正则表达式检查字符串开头的“+”