MinGW не будет связывать мой cmake target_link_libraries - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь скомпилировать мой проект cmake, в котором используются библиотеки tesseract stati c, которые не выполняются в процессе компоновки:

$ make VERBOSE=1
C:/msys64/mingw32/bin/cmake.exe -SC:/msys64/home/LZ/roosek_ocr2 -BC:/msys64/home/LZ/roosek_ocr2 --check-build-system CMakeFiles/Makefile.cmake 0
C:/msys64/mingw32/bin/cmake.exe -E cmake_progress_start C:/msys64/home/LZ/roosek_ocr2/CMakeFiles C:/msys64/home/LZ/roosek_ocr2/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/LZ/roosek_ocr2'
make -f CMakeFiles/roseek.dir/build.make CMakeFiles/roseek.dir/depend
make[2]: Entering directory '/home/LZ/roosek_ocr2'
C:/msys64/mingw32/bin/cmake.exe -E cmake_depends "Unix Makefiles" C:/msys64/home/LZ/roosek_ocr2 C:/msys64/home/LZ/roosek_ocr2 C:/msys64/home/LZ/roosek_ocr2 C:/msys64/home/LZ/roosek_ocr2 C:/msys64/home/LZ/roosek_ocr2/CMakeFiles/roseek.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/home/LZ/roosek_ocr2'
make -f CMakeFiles/roseek.dir/build.make CMakeFiles/roseek.dir/build
make[2]: Entering directory '/home/LZ/roosek_ocr2'
[ 25%] Linking CXX executable roseek.exe
C:/msys64/mingw32/bin/cmake.exe -E remove -f CMakeFiles/roseek.dir/objects.a
C:/msys64/mingw32/bin/ar.exe cr CMakeFiles/roseek.dir/objects.a @CMakeFiles/roseek.dir/objects1.rsp
C:/msys64/mingw32/bin/c++.exe    -Wl,--whole-archive CMakeFiles/roseek.dir/objects.a -Wl,--no-whole-archive  -o roseek.exe -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/roseek.dir/linklibs.rsp
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x2e): undefined reference to `tesseract::TessBaseAPI::TessBaseAPI()'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x93): undefined reference to `tesseract::TessBaseAPI::SetPageSegMode(tesseract::PageSegMode)'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xaf): undefined reference to `tesseract::TessBaseAPI::SetVariable(char const*, char const*)'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xc2): undefined reference to `pixRead'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x11f): undefined reference to `tesseract::TessBaseAPI::SetImage(Pix*)'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x133): undefined reference to `tesseract::TessBaseAPI::Recognize(ETEXT_DESC*)'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x140): undefined reference to `tesseract::TessBaseAPI::GetUTF8Text()'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x191): undefined reference to `tesseract::TessBaseAPI::Clear()'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x19c): undefined reference to `pixDestroy'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1ab): undefined reference to `tesseract::TessBaseAPI::~TessBaseAPI()'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1c9): undefined reference to `tesseract::TessBaseAPI::~TessBaseAPI()'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZN9tesseract11TessBaseAPI4InitEPKcS2_[__ZN9tesseract11TessBaseAPI4InitEPKcS2_]+0x4c): undefined reference to `tesseract::TessBaseAPI::Init(char const*, char const*, tesseract::OcrEngineMode, char**, int, GenericVector<STRING> const*, GenericVector<STRING> const*, bool)'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x33): undefined reference to `Roseek_MainCore_Init'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x45): undefined reference to `Roseek_ImageAcquisition_Start'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x7c): undefined reference to `Roseek_ImageAcquisition_GetResolution'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x87): undefined reference to `Roseek_ImageAcquisition_GetFrameRate'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x95): undefined reference to `Roseek_MediaEncoder_InitParamsV1'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0xff): undefined reference to `Roseek_MediaEncoder_CreateV1'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x19b): undefined reference to `Roseek_MediaEncoder_Close'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x1b4): undefined reference to `Roseek_NetStreamer_Close'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x1c0): undefined reference to `Roseek_ImageAcquisition_Stop'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x1c5): undefined reference to `Roseek_MainCore_UnInit'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x23b): undefined reference to `Roseek_ImageAcquisition_GetResolution'
C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/9.2.0/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles/roseek.dir/objects.a(ImageStream.cpp.obj):ImageStream.cpp:(.text+0x341): undefined reference to `Roseek_ImageAcquisition_FetchFrame'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/roseek.dir/build.make:125: roseek.exe] Error 1
make[2]: Leaving directory '/home/LZ/roosek_ocr2'
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/roseek.dir/all] Error 2
make[1]: Leaving directory '/home/LZ/roosek_ocr2'
make: *** [Makefile:84: all] Error 2

. Более подробно рассмотрим строки

C:/msys64/mingw32/bin/cmake.exe -E remove -f CMakeFiles/roseek.dir/objects.a
    C:/msys64/mingw32/bin/ar.exe cr CMakeFiles/roseek.dir/objects.a @CMakeFiles/roseek.dir/objects1.rsp
    C:/msys64/mingw32/bin/c++.exe    -Wl,--whole-archive CMakeFiles/roseek.dir/objects.a -Wl,--no-whole-archive  -o roseek.exe -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/roseek.dir/linklibs.rsp

Я не вижу, чтобы мои библиотеки передавались сюда. Кроме того, c++.exe не должен быть компилятором? Или это тоже связывание?

Мне кажется, я должен увидеть путь к добавленным библиотекам

Вот мой CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

project(roseek LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

#set(CMAKE_AUTOUIC ON)
#set(CMAKE_AUTOMOC ON)
#set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#find_package(Qt5 COMPONENTS Core Quick REQUIRED)

add_executable(roseek
  main.cpp
  qml.qrc
  ImageStream.cpp
  YuvUtils.cpp
  #CameraView.cpp
)

add_library(ctmedia_codec MODULE IMPORTED)
add_library(ctstream MODULE IMPORTED)
add_library(maincore MODULE IMPORTED)

add_library(tesseract STATIC IMPORTED)
add_library(lept STATIC IMPORTED)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/mingw-w64-x86_64-static-tesseract/include/tesseract)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/mingw-w64-x86_64-static-tesseract/include/leptonica)

set_target_properties(ctmedia_codec PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/win_bin/lib/x64/CTMedia.lib)
set_target_properties(ctstream PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/win_bin/lib/x64/CTStream.lib)
set_target_properties(maincore PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/win_bin/lib/x64/WPMainCore.lib)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/mingw-w64-x86_64-static-tesseract/include/)

set_target_properties(tesseract PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/mingw-w64-x86_64-static-tesseract/lib/libtesseract.a)
set_target_properties(lept PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/mingw-w64-x86_64-static-tesseract/lib/liblept.a)


include_directories("include")
target_link_libraries(roseek ctmedia_codec ctstream maincore tesseract lept)
...