opencv_contrib icon indicating copy to clipboard operation
opencv_contrib copied to clipboard

modules/text ignores libtesseract.so location specified by CMake TesseractConfig.cmake

Open intractabilis opened this issue 3 years ago • 0 comments

OpenCV => 4.x branch snapshot. Operating System / Platform => Linux Compiler => doesn't matter, but I will describe the issue using Clang as an example

Imagine you are compiling OpenCV with Clang and LLVM's libc++. You already have Tesseract library compiled with Clang and LLVM's libc++, with the correspondent CMake config module in yourspecialprefix/lib/cmake/tesseract. Even though OpenCV's CMake configuration step correctly picks up yourspecialprefix/lib/cmake/tesseract/TesseractConfig.cmake and correctly sets up Tesseract_LIBRARY_DIRS, the build process will try to link the module with '/usr/lib/libtesseract.so', which will fail because the system's Tesseract is built with GCC standard library, not LLVM's libc++:

/home/user/clang-env/include/tesseract/baseapi.h:212: error: undefined reference to 'tesseract::TessBaseAPI::Init(char const*, char const*, tesseract::OcrEngineMode, char**, int, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const*, bool)'
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)

Here is an easy way to detect the problem as early as in the configuration step:

$ git clone --branch 4.x https://github.com/opencv/opencv_contrib
$ git clone --branch 4.x https://github.com/opencv/opencv.git
$ mkdir opencv-build
$ cd opencv-build
$ strace -fe openat cmake -Wno-dev -LA -G Ninja -DBUILD_EXAMPLES=OFF -DBUILD_TESTS==OFF -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -DWITH_CUDA=OFF -DWITH_VULKAN=ON -DWITH_GSTREAMER=OFF -DWITH_OPENMP=ON -DWITH_FFMPEG=ON -DWITH_OPENGL=ON -DWITH_GTK=OFF -DOPENCV_ENABLE_NONFREE=ON -DCMAKE_CXX_FLAGS="-stdlib=libc++" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=${HOME}/clang-env -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang ../opencv 2>&1 | grep -i tesseract
openat(AT_FDCWD, "/usr/include/tesseract", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
openat(AT_FDCWD, "/home/user/clang-env/lib/cmake/tesseract/TesseractConfigVersion.cmake", O_RDONLY) = 3
openat(AT_FDCWD, "/home/user/clang-env/lib/cmake/tesseract/TesseractConfig.cmake", O_RDONLY) = 3
openat(AT_FDCWD, "/home/user/clang-env/lib/cmake/tesseract/TesseractTargets.cmake", O_RDONLY) = 3
openat(AT_FDCWD, "/home/user/clang-env/lib/cmake/tesseract/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
openat(AT_FDCWD, "/home/user/clang-env/lib/cmake/tesseract/TesseractTargets-release.cmake", O_RDONLY) = 3
-- Tesseract:   YES (ver 5.1.0)
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeLists.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeLists.txt", O_RDONLY) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeCache.txt.tmp3c3e1", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles/cmake.check_cache", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/build.ninja.tmp63334", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles/rules.ninja.tmp74d73", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/cmake_install.cmake.tmpf1f22", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles/TargetDirectories.txt.tmpefc74", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeCache.txt.tmpe8e3a", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeCache.txt.tmpe8e3a", O_RDONLY) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeCache.txt", O_RDONLY) = 4
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles/cmake.check_cache", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/libs-dev/opencv_contrib/modules/text/cmake/checks/tesseract_test.cpp", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "CMakeFiles/cmTC_7acc5.dir/tesseract_test.cpp-32885d87.o.tmp", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0666) = 4
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/baseapi.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/export.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/pageiterator.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/publictypes.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/resultiterator.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/ltrresultiterator.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/unichar.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "/home/user/clang-env/include/tesseract/version.h", O_RDONLY|O_CLOEXEC) = 3
[pid 173266] openat(AT_FDCWD, "CMakeFiles/cmTC_7acc5.dir/tesseract_test.cpp.o.d", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3
[pid 173265] openat(AT_FDCWD, "CMakeFiles/cmTC_7acc5.dir/tesseract_test.cpp.o.d", O_RDONLY) = 3
[pid 173269] openat(AT_FDCWD, "CMakeFiles/cmTC_7acc5.dir/tesseract_test.cpp.o", O_RDONLY|O_CLOEXEC) = 6
[pid 173269] openat(AT_FDCWD, "/usr/lib64/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib64/libtesseract.so", O_RDONLY|O_CLOEXEC) = 9
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles/cmTC_7acc5.dir", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles/cmTC_7acc5.dir", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
openat(AT_FDCWD, "/home/user/libs-dev/opencv-build/cmake_check/tesseract/CMakeFiles/CMakeTmp/CMakeFiles", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
Tesseract_DIR:PATH=/home/user/clang-env/lib/cmake/tesseract
WITH_TESSERACT:BOOL=ON

We can check that Tesseract_LIBRARY_DIRS was in fact correctly set:

$ grep -RPn Tesseract_LIBRARY_DIRS .
./CMakeVars.txt:4510:Tesseract_LIBRARY_DIRS=/home/user/clang-env/lib

And that libtesseract.so is in fact there:

$ ls -l /home/user/clang-env/lib/libtesseract.so
lrwxrwxrwx 1 user user 21 апр 17 11:19 /home/user/clang-env/lib/libtesseract.so -> libtesseract.so.5.1.0

intractabilis avatar Apr 17 '22 20:04 intractabilis