我在ubuntu上使用以下内容构建了OpenCV:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D BUILD_SHARED_LIBS=OFF \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_JAVA=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_ZLIB=ON \
-D BUILD_TIFF=ON \
-D BUILD_JASPER=ON \
-D BUILD_JPEG=ON \
-D BUILD_PNG=ON \
-D BUILD_OPENEXR=ON \
-D BUILD_WEBP=ON \
-D BUILD_EXAMPLES=OFF ..
天真地假设cmake会自动处理我的测试程序的链接计划。但是,为了使我的自动移植脚本能够工作,我被迫尝试直接从cmake输出恢复库构建变量,以重建我需要的共享和静态依赖项。
externalLibs=$(/bin/opencv_version -v | grep ' Extra dependencies:' | cut -d':' -f2 | sed -r 's/( )+/ -l/g')
staticLibs=$(cat OpenCVModules.cmake | grep 'IMPORTED_LOCATION_RELEASE' | sed -r 's/IMPORTED_LOCATION_RELEASE//g' | sed -rz 's/[" \r\n]+/ /g' )
headers=$(cat OpenCVConfig.cmake | grep 'set(OpenCV_INCLUDE_DIRS ' | sed -r 's/set\(OpenCV_INCLUDE_DIRS//g' | sed -r 's/( ")+/ -I/g' | sed -r 's/["\)]+//g' )
我遇到过的问题(缺少引用的屏幕,例如"对`cv :: softdouble :: operator /&#34的未定义引用;)似乎过时了: Undefined references in static OpenCV libraries Undefined references in static OpenCV libraries 其他人使用的解决方案似乎特定于用例: https://forum.qt.io/topic/51543/solved-cannot-link-libs-statically Why does the order in which libraries are linked sometimes cause errors in GCC?
是否有更好的方法可以在cmake中针对特定的一组静态opencv库导入和构建程序,而无需安装特定于体系结构的构建版本来处理cmake魔术?
或者人们实际上手动静态链接20个奇怪的库; - )
ar cr libopencv_core.a myappobj.o
任何见解都会受到赞赏,因为cmake文件变得越来越复杂,因为我还打算将wxWidgets静态链接到同一个程序中。通过在opencv测试应用程序的构建树中对自动生成的cmake link.txt文件进行逆向工程,我取得了一些进展。但是,必须有一种更好的方法来做到这一点,而不必恢复到并不总是跨平台友好的共享库...; - )