我是opencv的新手。而且我发现应该使用pkg-config --cflags --libs opencv -lopencv_core -lopencv_imgcodecs
来顺利编译。但我只是不知道为什么在编译时保持得到“未定义的引用”错误,输出结果和我的Makefile如下:
1.对于产出:
g++ -Wall -g opencv.cpp
/tmp/ccg5WiIh.o: In function `main':
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:14: undefined reference to `cv::imread(cv::String const&, int)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:25: undefined reference to `cv::namedWindow(cv::String const&, int)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:26: undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:29: undefined reference to `cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
/home/akatsuki/Documents/Projects/simpleTest/opencv/opencv.cpp:31: undefined reference to `cv::waitKey(int)'
/tmp/ccg5WiIh.o: In function `cv::String::String(char const*)':
/usr/include/opencv2/core/cvstd.hpp:622: undefined reference to `cv::String::allocate(unsigned long)'
/tmp/ccg5WiIh.o: In function `cv::String::~String()':
/usr/include/opencv2/core/cvstd.hpp:664: undefined reference to `cv::String::deallocate()'
/tmp/ccg5WiIh.o: In function `cv::Mat::~Mat()':
/usr/include/opencv2/core/mat.inl.hpp:592: undefined reference to `cv::fastFree(void*)'
/tmp/ccg5WiIh.o: In function `cv::Mat::release()':
/usr/include/opencv2/core/mat.inl.hpp:704: undefined reference to `cv::Mat::deallocate()'
/tmp/ccg5WiIh.o: In function `cv::Mat::operator=(cv::Mat&&)':
/usr/include/opencv2/core/mat.inl.hpp:1215: undefined reference to `cv::fastFree(void*)'
collect2: error: ld returned 1 exit status
Makefile:16: recipe for target 'opencv.o' failed
make: *** [opencv.o] Error 1
2.对于Makefile:
CC = g++
CCFLAG = -Wall -g
Linker = `pkg-config --cflags --libs opencv` -lopencv_core -lopencv_imgcodecs
all: opencv.exe
opencv.exe: opencv.o
g++ -o $@ opencv.o $(Linker)
chmod a+x $@
opencv.o: opencv.cpp
$(CC) $(CCFLAG) opencv.cpp
任何人都可以帮我解决问题吗?谢谢〜
对于搜索相关问题的任何人,我都会留下回复。
以下命令打印OpenCV头文件的目录。
pkg-config --cflags opencv
// -I/usr/local/include/opencv -I/usr/local/include
以下命令打印共享对象文件
(在以下情况下的/usr/local/lib
目录下)
用于动态链接。
动态链接是链接您的可删除文件(如main
文件)
在运行时共享目标文件(如.so
文件)
pkg-config --libs opencv
// -L/usr/local/lib -lopencv_cudabgsegm -lopencv_cudaobjdetect
// -lopencv_cudastereo -lopencv_stitching -lopencv_cudafeatures2d
// -lopencv_superres -lopencv_cudacodec -lopencv_videostab
// ...
您可以使用以上打印的依赖项
(编译命令中的头文件目录和共享目标文件)
通过写pkg-config --cflags opencv
和pkg-config --libs opencv
g++ `pkg-config --cflags opencv` \
-o main \
/your_cpp_file_path/source.cpp \
`pkg-config --libs opencv`
请注意,`
是反复的角色,而不是'
使用linux命令中的反引号字符
在命令中使用命令的结果
例如,这部分pkg-config --cflags opencv
被替换
与pkg-config --cflags opencv
的结果