opencv V3 混合共享和非共享
opencv V3 mixing shared and non shared
如果在 Ubuntu 14.04.3 LTS 上编译,openCV 的当前稳定 (V3.0.0) 和不稳定 (V3.1.0) 版本正在混合共享和非共享库。
Linking CXX shared library ../../lib/libopencv_videoio.so
/usr/bin/ld: /usr/local/lib/libavcodec.a(avpacket.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [lib/libopencv_videoio.so.3.1.0] Error 1
make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
make: *** [all] Error 2
尝试使用 libavcodec.a
创建 libopencv_videoio.so
似乎是问题所在。有一个关于此的 bug report,但它只是提供检查是否安装了 libavcodec.so
的建议(安装)以及使用 -DBUILD_SHARED_LIBS=OFF
来防止创建共享库的解决方法。有谁知道这个问题的原因。 openCV 的人只是说 Ubuntu 打包的 ffmpeg 库是不正确的。有什么想法吗?
这个问题好像是老问题了。我刚刚发现一个非常 similar question 没有回答但评论了使用 ./configure --enable-shared
编译 ffmpeg 的建议。但是已经有一个共享库 /usr/lib/x86_64-linux-gnu/libavcodec.so
显然找不到。我不是 cmake
专家,但这难道不是构建过程失误的问题吗?
谢谢 usr1234567。你让我走上了正轨,问题现在已经解决了。
关于 avcodec 不是 Ubuntu 中的 false-labeled 但由于历史原因 false-labeled 在 openCV 的 cmake-files 中。但这不是问题。
问题是 cmake 寻找库的搜索策略有点奇怪。它似乎更喜欢“/usr/local/lib”而不是“/usr/lib”。这在一般情况下是可以的。但是,如果本地有静态库而没有动态库,则它会使用静态库而不是在 /usr/lib 中搜索动态库。
所以吸取的教训是;使用 checkinstall
正确清理本地的旧尝试;对 cmake 的搜索策略不信任:不要指望 umake 找到唯一的动态库,如果周围有非分发静态库,即使唯一的动态库在正确的目录中。
如果在 Ubuntu 14.04.3 LTS 上编译,openCV 的当前稳定 (V3.0.0) 和不稳定 (V3.1.0) 版本正在混合共享和非共享库。
Linking CXX shared library ../../lib/libopencv_videoio.so
/usr/bin/ld: /usr/local/lib/libavcodec.a(avpacket.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libavcodec.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [lib/libopencv_videoio.so.3.1.0] Error 1
make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
make: *** [all] Error 2
尝试使用 libavcodec.a
创建 libopencv_videoio.so
似乎是问题所在。有一个关于此的 bug report,但它只是提供检查是否安装了 libavcodec.so
的建议(安装)以及使用 -DBUILD_SHARED_LIBS=OFF
来防止创建共享库的解决方法。有谁知道这个问题的原因。 openCV 的人只是说 Ubuntu 打包的 ffmpeg 库是不正确的。有什么想法吗?
这个问题好像是老问题了。我刚刚发现一个非常 similar question 没有回答但评论了使用 ./configure --enable-shared
编译 ffmpeg 的建议。但是已经有一个共享库 /usr/lib/x86_64-linux-gnu/libavcodec.so
显然找不到。我不是 cmake
专家,但这难道不是构建过程失误的问题吗?
谢谢 usr1234567。你让我走上了正轨,问题现在已经解决了。
关于 avcodec 不是 Ubuntu 中的 false-labeled 但由于历史原因 false-labeled 在 openCV 的 cmake-files 中。但这不是问题。
问题是 cmake 寻找库的搜索策略有点奇怪。它似乎更喜欢“/usr/local/lib”而不是“/usr/lib”。这在一般情况下是可以的。但是,如果本地有静态库而没有动态库,则它会使用静态库而不是在 /usr/lib 中搜索动态库。
所以吸取的教训是;使用 checkinstall
正确清理本地的旧尝试;对 cmake 的搜索策略不信任:不要指望 umake 找到唯一的动态库,如果周围有非分发静态库,即使唯一的动态库在正确的目录中。