详情请见:
https://blog.csdn.net/qq_42067550/article/details/122634801
安装好了 OpenCV
但是在 VScode 里面花了3天时间尝试设置,最后以失败告终,转用 Xcode 后一切顺利,没有任何报错。。。。。
报错代码:
Undefined symbols for architecture x86_64:
"__ZN2cv11namedWindowERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi", referenced from:
_main in cckR1lBO.o
"__ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi", referenced from:
_main in cckR1lBO.o
"__ZN2cv6imshowERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_11_InputArrayE", referenced from:
_main in cckR1lBO.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
网上查了很多,百度谷歌都试过了,没有找到一个有用的解决方案。
害得我以为是 OpenCV 安装出了问题,重装了 3 次,还把 VScode 也重装了好几次,无功而返。
从问题描述来看,一旦调用了 OpenCV 的函数,比如 imread,imshow 等就会出错,原因不明。
之前尝试过的方法罗列出来,避免遇到同样问题的人再踩坑:
-std=c++11
g++-11
安装 homebrew,使用国内源速度很快!
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
依赖环境:
首先是 xcode
sudo xcode-select --install
然后是 pkg-config 用于精简编译(不确定在 xcode 环境下是否需要这个,vscode是需要的)
brew install pkg-config
使用 homebrew 安装
这里命令中不需要 opencv4,只要 opencv 即可
brew install opencv
速度很快也很快,而且各个文件夹路径设置的也很合理,建议 MAC 系统下还是使用 brew 安装比较好!
然后配置环境变量,前面一长串不重要,重要的是你看最后的结尾要对得上,因为有的安装完后会有软链接,比如/usr/local/opt/opencv/4.5.4/bin
这种形式
export PATH="/usr/local/opt/opencv@4/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/opencv@4/lib"
export CPPFLAGS="-I/usr/local/opt/opencv@4/include"
export PKG_CONFIG_PATH="/usr/local/opt/opencv@4/lib/pkgconfig"
下载地址:OpenCV 源代码
使用下载源代码编译安装,这种方式最后得到的路径和 brew 安装是有区别的,在 IDE 中设置的时候需要根据情况看(反正我试了是不一样的,不知道别人如何)
下载后进行解压到任意目录。
比如我的目录/users/jack/opencv-4.5.4
cd /users/jack/opencv-4.5.4
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..
make # make -j2 可以加速
sudo make install
这里注意两点:
-DOPENCV_GENERATE_PKGCONFIG=ON
这个语句用于生成 opencv4.pc
文件,安装 opencv3的时候不需要,但是安装 opencv4 是必须的。
另外 最后的两个点别漏了 ..
编译的时间非常漫长,需要加快速度可以用:
make -j2
安装完成后配置环境变量
PKG_CONFIG_PATH="/users/jack/opencv-4.5.4/release/unix-install"
然后检查一下
pkg-config --libs --cflags opencv4
显示了一长串内容:
这些内容是存在于opencv4.pc
中的配置。
下载一张测试图片到 Downloads 文件夹,命名为 opencv.png
然后在 VScode 新建文件 test.cpp
:
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
Mat src, dst, src_gray;
char* window_name = (char*)"Demo";
/**
* @主函数
*/
int main( int argc, char** argv )
{
/// 读取一副图片
src = imread(argv[1], 1 );
/// 将图片转成灰度图片
cvtColor(src, src_gray, COLOR_RGB2GRAY);
namedWindow(window_name, WINDOW_AUTOSIZE);
imshow(window_name, src_gray);
while(true) {
int c;
c = waitKey(20);
if (27 == (char) c) {
break;
}
}
}
## 编译测试程序
g++-11 `pkg-config opencv4 --libs --cflags opencv4` ./test.cpp -o ./test.o
## 运行测试程序
./test.o ~/Downloads/opencv.png
不出意外的话应该是现实一个转成黑白的图片,但是不幸的是这里出现了本文开头提到的报错~~~。
不甘心的我还是继续进行了尝试
先为VScode安装一些插件
在根目录下创建一个.vocode文件夹,再创建三个文件。
.vscode/launch.json
.vscode/tasks.json
.vscode/c_cpp_properties.json
文件tasks.json
如下:
{
"tasks": [
{
"type": "shell",
"label": "g++ build active file",
"command": "/usr/local/bin/g++-11",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.o",
"`pkg-config",
"opencv4",
"--libs",
"--cflags",
"opencv4`"
],
"options": {
"cwd": "/usr/local/bin"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
],
"version": "2.0.0"
}
launch.json
文件:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.o",
"args": [
"~/Downloads/opencv.png"
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [
{"name": "PKG_CONFIG_PATH", "value": "/Users/jack/opencv-4.5.4/release/unix-install"}, // 这是opencv解压码后创建的release目录下的unix-install, 要保证该目录下下有opencv.pc文件
{"name": "DYLD_LIBRARY_PATH", "value": "/usr/local/lib"}
],
"externalConsole": true, // 这个表示新开一个命令行窗口并运行程序。
"MIMode": "lldb",
"preLaunchTask": "g++ build active file" // 这里内容要和`.vscode/tasks.json`的`tasks`->`label`字段一样!
}
]
}
c_cpp_properties.json
文件
{
"configurations": [
{
"name": "Mac",
"includePath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
"${workspaceFolder}",
"/usr/local/include/opencv4"
],
"browse": {
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "",
"path": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
"${workspaceFolder}",
"/usr/local/include/opencv4"
]
},
"intelliSenseMode": "macos-gcc-x64",
"macFrameworkPath": [
"/System/Library/Frameworks",
"/Library/Frameworks"
],
"compilerPath": "/usr/local/bin/g++-11",
"cStandard": "c11",
"cppStandard": "c++11"
}
],
"version": 4
}
运行 --》 启动调试
依然之前提到的错误,无解~~~
这里设置就轻松多了
打开 Xcode
选择 Create a new Xcode project
选择 Command Line Tool,然后 Next
输入项目名称
创建项目文件夹,点击 Create
得到以下界面
在右边的工具栏点选 Build Settings
找到 S
然后要配置路径了
主要就是蓝色框的Header Search Paths
和 Library Search Paths
这里需要在红色框
处进行双击
点击下面的加号,就可以添加路径了
这里为Header Search Paths
添加 /usr/local/include/opencv4
为Library Search Paths
添加 /usr/local/lib
(下面的 /usr/local/Cellar/gdk-pixbuf/2.42.6/lib
是后面自动被系统添加进去的,原因未知)
右键点击左侧的项目名,选择 New Group
输入名称 lib
右键点击lib
,选择 Add Files to
然后直接用 shift+command+g
进行路径搜索 /usr/local/lib
(如果用 brew 安装的,位置估计应该是 /usr/local/opt/opencv@4/lib
)可以查看下具体的文件位置然后进行填写
搜索出来后,全选所有文件点击 Add
下面多处一长串
把之前的测试代码复制到 main.cpp
中
然后点击Product —> Build
前往输出的可执行文件所在目录
/Users/jack/Library/Developer/Xcode/DerivedData/
进入所在项目文件夹
可以看到
输出的文件 Opencv_test
打开终端
输入可执行文件地址和测试图片地址
/Users/jack/Library/Developer/Xcode/DerivedData/Opencv_test-bauyfnqfpaknutbrtnmmaculhedy/Build/Products/Debug/Opencv_test /Users/jack/Downloads/opencv.png