升级到 OS X Mavericks 后架构 x86_64 的 OpenCV 未定义符号

Posted

技术标签:

【中文标题】升级到 OS X Mavericks 后架构 x86_64 的 OpenCV 未定义符号【英文标题】:OpenCV Undefined symbols for architecture x86_64 after upgrading to OS X Mavericks 【发布时间】:2013-10-24 00:09:46 【问题描述】:

我有一个运行良好的 opencv 项目。今天我已将我的 OS X lion 升级到 Maverick,但 imwrite 功能出现以下错误:

Undefined symbols for architecture x86_64:
  "cv::imwrite(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cv::_InputArray const&, std::__1::vector<int, std::__1::allocator<int> > const&)", referenced from:
      _main in Hello.o
ld: symbol(s) not found for architecture x86_64

我不得不说其他 opencv 函数仍在工作(例如 cvWaitKey()、cvShowImage 等)但 imwrite 和 imread 不再工作了。

你可以在下面看到我使用的makefile:

CXX = g++
CXXFLAGS = -O2 -g -Wall -fmessage-length=0 
CPPFLAGS = -I/usr/local/Cellar/opencv/2.4.6.1/include

OBJS =      Hello.o

LDFLAGS = -L/usr/local/Cellar/opencv/2.4.6.1/lib
LDLIBS =  -lopencv_core -lopencv_imgproc -lopencv_calib3d -lopencv_video \
          -lopencv_features2d -lopencv_ml -lopencv_highgui -lopencv_objdetect \
          -lopencv_contrib -lopencv_legacy -lopencv_gpu

TARGET =    Hello

.PHONY: all
all: $(TARGET)
$(TARGET):  $(OBJS)
         $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

.PHONY: clean
clean:
        rm -f $(OBJS) $(TARGET)

解决方案: 我通过安装 opencv 2.4.3 解决了这个问题。您可能会在我添加的答案中找到更多详细信息。

【问题讨论】:

@DuncanJones,它与您链接的那个无关。那个是升级xcode的问题。 【参考方案1】:

我在使用 g++ 编译时使用 -mmacosx-version-min=10.8 选项解决了这个问题。这可能不是一个永久的解决方案,但至少我的代码可以再次编译。

【讨论】:

感谢您的回答。虽然我已经解决了这个问题,但是我也尝试了这个,但它不起作用。对于有同样问题的人,我将在答案中添加我的解决方案。【参考方案2】:

我敢打赌,你的库错了。确保您使用 64 位库进行 64 位构建,调试库用于调试构建等。另一个常见原因是您的 opencv 版本是旧版本? 2.3?如果你有最新的,那么很可能是库问题

另外澄清一下,imread 和 imwrite 不仅在调试中起作用,还是在调试和发布中都起作用?

希望我的回答对你有所帮助。如果还有问题,请告诉我。

【讨论】:

感谢您的回答。我正在使用 opencv 2.4.6.1。 Opencv 库是在我的计算机 OS X (10.8) 上编译的,现在我使用的是 OS X 10.9。我在问题中添加了编译我的代码的makefile。 我遇到了同样的问题,同样的环境给你。我用macbrew安装opencv,2.4.6.1出现问题,切换2.4.5修复了,所以我认为是2.4.6.1的问题。 @Yang,感谢您的评论。您是否使用自制软件安装了 opencv 2.4.5? 是的,我的 2.4.5 安装时间早,直接 brew switch 就可以了。所以如果你新安装2.4.5能编译成功,就证明问题只出在2.4.6.1上。 因为我正在尝试并且自制程序无法在我的情况下制作 opencv 2.4.5 并且它没有任何建议。【参考方案3】:

正如杨在其中一个 cmets 中提到的,问题来自于 opencv 2.4.6.1。我通过运行以下命令使用Cmake installer 安装了opencv 2.4.3,它可以工作:

tar -xf opencv-2.4.3.tar.gz
cd opencv-2.4.3
echo "#define GTEST_USE_OWN_TR1_TUPLE 1" | cat > temp1
cat modules/ts/include/opencv2/ts/ts_gtest.h > temp2
cat temp1 temp2 > modules/ts/include/opencv2/ts/ts_gtest.h
mkdir build
cd build
cmake .. -Wno-dev
make -j8 && sudo make install

P.S:我无法使用自制软件安装任何旧版本的opencv,你可以看到here

【讨论】:

以上是关于升级到 OS X Mavericks 后架构 x86_64 的 OpenCV 未定义符号的主要内容,如果未能解决你的问题,请参考以下文章

在 OS X 10.9 (Mavericks) 上安装 Java

在 migratePersistentStore: 到 OS X 10.9 Mavericks 上的另一个 URL 后访问 NSManagedObject 属性时崩溃

OS X Mavericks 上 gtest 的链接器错误

使 PHP 的 mail() 函数在 OS X Mavericks 上工作的分步指南

转OS X Mavericks: 防止 Mac 进入睡眠 -- 不错

OS X 10.9 Mavericks - 使用虚拟主机设置本地主机