升级到 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 属性时崩溃
使 PHP 的 mail() 函数在 OS X Mavericks 上工作的分步指南