Ошибка создателя Qt: не удается найти -lopencv_imgcodecs

#c #qt #opencv #cmake #qt-creator

#c #qt #opencv #cmake #qt-creator

Вопрос:

Я установил opencv, qt, qt creator, cmake на ubuntu 15.10 через VMware в Windows.

В этом каталоге установлен opencv: /home/majidalaeinia/opencv/

Репозиторий проекта клонирован в этом каталоге: /home/majidalaeinia/Desktop/imgwarp-opencv/

Я хочу запустить проект через его CMakeLists.txt в qt creator и когда я нажимаю Build now в qt creator, я получаю следующие ошибки:

 error: cannot find -lopencv_imgcodecs
error: collect2: error: ld returned 1 exit status
  

В чем проблема и как я могу ее решить?

Комментарии:

1. Есть ли у вас каталог, в котором libopencv_imgcodecs.so он существует в вашей библиотеке CMakeLists.txt путь к библиотеке? Вы находите это в CMake с find_package() помощью?

2. Нет, у меня нет этого файла. Как я должен связать opencv с проектом? Пожалуйста, обратите внимание, что они находятся в разных каталогах.

3. Разные папки в порядке, если вы сообщите CMake, как его найти. Вы хотите сказать, что у вас нет той библиотеки, с которой вы хотите связать (это может быть a .a вместо a .so или иметь расширение типа .so.1 или четное .so.2.55.3 (числа, выбранные полуслучайно))?

4. Я попробовал эти команды: find /home/majidalaeinia/opencv -type f -name "libopencv_imgcodecs" и find /home/majidalaeinia/Desktop/imgwarp-opencv -type f -name "libopencv_imgcodecs" ничего не нашел.

5. Вам нужно добавить туда звездочку: find ~/opencv -name "libopencv*" должно быть достаточно.

Ответ №1:

@ Majid Alaeinia, в CMakeLists.txt опубликованном вами файле не указано, как CMAKE следует находить библиотеки, запрошенные в вашем проекте. Также не target_link_libraries объявлено, поэтому CMAKE не знает, где их связать. Надеюсь, следующий небольшой пример шаблона должен быть полезен для вашего проекта:

 cmake_minimum_required (VERSION 3.1)
project(yourProject)

find_package( OpenCV REQUIRED )
find_package( Qt5 REQUIRED COMPONENTS Sql )

### this is for c  11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c  11")
set(CMAKE_INCLUDE_CURRENT_DIR ON)

### QT stuff if you want a GUI
set(CMAKE_AUTOMOC ON)  # autogenerate qt gui features
set(CMAKE_AUTORCC ON)  # used for QT resource Files (if you need)

## Additional operation...

# From here you are specifically linking all OpenCV libraries and executables
### Add executables
add_executable(yourExecutable main/main.cpp ui/res/res.qrc ${SRCS} ${UI_HDRS} ${UI_SRCS})
target_link_libraries (yourProject example Qt5::Widgets ${OpenCV_LIBS}  Qt5::Sql)

### Add Library
add_library(yourProject_lib SHARED ${SRCS} ${UI_HDRS})
target_link_libraries (yourProject_lib example Qt5::Widgets ${OpenCV_LIBS})
  

Комментарии:

1. Спасибо, это может помочь, но я до сих пор не знаю, как это сделать, потому что CMakeLists.txt в других каталогах есть и другие. Пожалуйста, проверьте репозиторий .

Ответ №2:

@ Majid Alaeinia, я загрузил репозиторий и просмотрел код. если вы зайдете в demo папку и измените существующий CMakeLists.txt файл на тот, который я предоставил ниже, он должен скомпилироваться (он компилируется на моем с предоставленными изменениями):

 project(demo)
cmake_minimum_required(VERSION 2.6)
find_package(Qt5 REQUIRED COMPONENTS Widgets Core)
FIND_PACKAGE( OpenCV REQUIRED )

include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/lib ${CMAKE_CURRENT_SOURCE_DIR})

set(demo_SRCS main.cpp projfile.cpp deformwin.cpp myimage.cpp singlephotoview.cpp pointspaint.cpp)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c  11")
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#qt5_automoc(${demo_SRCS})

QT5_WRAP_CPP(QOBJ_CPP ${demo_SRCS})
qt5_wrap_ui(helloworld_FORMS_HEADERS deformwin.ui)
add_executable(demo ${demo_SRCS} ${helloworld_FORMS_HEADERS})
target_link_libraries(demo ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} imgwarp-lib opencv_core opencv_imgproc opencv_imgcodecs)
  

Код в репозитории является старым кодом и по-прежнему Qt4 используется в качестве основных оболочек. Я думаю, что вы, вероятно Qt5 , установили на свой компьютер, и на самом деле код, который я предоставил, будет работать Qt5 . Используйте его в качестве ориентира для другого CMakeLists.txt файла, присутствующего внутри src папки, и измените соответствующим образом.

CMake будет скомпилирован, но поскольку он использовался Qt4 , вам нужно определить наиболее важные модули для добавления, например, новый стандарт для включения QtGui/QApplication обычно заменяется QtWidgets/QApplication

Я также хотел оставить свой предыдущий ответ на случай, если вам нужна отправная точка или начальный шаблон. Я надеюсь, что это прояснит немного больше и поможет вам продвинуться вперед в вашем проекте.