我正在使用QT creator 3.2.1/QT 5.3.2(clang5.0(苹果))自学"opencv2计算机视觉应用程序编程食谱"一书。当我尝试构建一个程序时,我收到如下警告:
Undefined symbols for architecture x86_64:
"cv::imread(std::string const&, int)", referenced from:
MainWindow::on_pushButton_clicked() in mainwindow.o
ColorDetectController::setInputImage(std::string) in mainwindow.o
"cv::imshow(std::string const&, cv::_InputArray const&)", referenced from:
MainWindow::on_pushButton_clicked() in mainwindow.o
MainWindow::on_pushButton_2_clicked() in mainwindow.o
"std::allocator<char>::allocator()", referenced from:
MainWindow::on_pushButton_clicked() in mainwindow.o
MainWindow::on_pushButton_2_clicked() in mainwindow.o
"std::allocator<char>::~allocator()", referenced from:
MainWindow::on_pushButton_clicked() in mainwindow.o
MainWindow::on_pushButton_2_clicked() in mainwindow.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
MainWindow::on_pushButton_clicked() in mainwindow.o
MainWindow::on_pushButton_2_clicked() in mainwindow.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
MainWindow::on_pushButton_clicked() in mainwindow.o
MainWindow::on_pushButton_2_clicked() in mainwindow.o
ld: symbol(s) not found for architecture x86_64
**clang: error: linker command failed with exit code 1** (use -v to see invocation)
make: *** [controller.app/Contents/MacOS/controller] Error 1
14:49:33: **The process "/usr/bin/make" exited with code 2**.
Error while building/deploying project controller (kit: Desktop Qt 5.3 clang 64bit)
When executing step "Make"
这是我的 .pro 文件:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = controller
TEMPLATE = app
SOURCES += main.cpp
mainwindow.cpp
../colorDetection/colorDetector.cpp
colorDetectController.cpp
HEADERS += mainwindow.h
../colorDetection/colorDetector.h
colorDetectController.h
FORMS += mainwindow.ui
CONFIG += c++11
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.10
INCLUDEPATH += "/usr/local/opt/opencv/include"
LIBS += -L"/usr/local/opt/opencv/lib"
-lopencv_core
-lopencv_highgui
-lopencv_imgproc
我以前遇到过类似的警告,但我通过将这两行添加到 .pro 文件中来解决这个问题:
CONFIG += c++11
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.10
但是,这次它不起作用。谁能向我解释如何解决这个问题?多谢。
这不是警告,而是错误。链接器错误。特别是,线
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
意味着它甚至无法链接标准的 std::string,这很奇怪。
它找不到适用于 x64 体系结构的库。我在您的配置中没有看到为此架构编译的开关,因此我假设这是一种默认行为,这反过来意味着编译器应该附带一个相应的库(至少带有 std::string)。
这让我想到了这个问题(尽管它是针对 gcc 的),问题在于 libstdc++ 太旧了,因此它不包含 C++11 标准的一些定义。
然后我查看了带有 std::basic_string 描述的页面,发现由于成员中的 c++11 被std::allocator
使用,这就是我在关于字符串的未定义引用的大括号内看到的。
因此,您的c ++库太旧的问题。您需要更新编译器。我从你的帖子中注意到的另一件有趣的事情是:你可能说了一个错误的叮当声版本。你说它是clang-5.0
,所以我在我的 Kubuntu 中查看了版本,它只是3.4
.我想知道:我这么久没有更新系统吗?然后我决定偷看 clang 网站,发现最新版本(写成"正在进行中")只是3.7
。
我需要提到的最后一件事是开头的两个未定义的引用 — 您只需要添加一个包含函数 cv::imread
和 cv::imshow
的库的路径。