Перейти к содержимому
Compvision.ru
mrgloom

Как определить где старые ф-ии?

Recommended Posts

Пытаюсь собрать старый проект на Linux

пишет что то типа 

undefined reference to `cvCreateMat'

cvCreateMat вроде как должно быть определено в opencv_core

Искал в хедерах 

 grep -n -r cvCreateMat /home/blabla/libs/opencv-2.4.10/include

в makefile добавляю

 -lopencv_core

 

в коде 

#include <core/core_c.h>

проверял так же на присутствие в .so файле

nm -C libopencv_core.so > functions.txt

grep -n cvCreateMat functions.txt

но все равно та же ошибка

 

makefile

IFLAGS = -I/home/blabla/libs/opencv-2.4.10/include/opencv2
LFLAGS = -L/home/blabla/libs/opencv-2.4.10/lib
OPENCVLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_calib3d -lopencv_video -lopencv_features2d -lopencv_ml -lopencv_objdetect -lopencv_contrib -lopencv_legacy

all: congealReal funnelReal

clean:
	rm congealReal funnelReal

congealReal: congealReal.cpp
	g++ $(IFLAGS) $(LFLAGS) $(OPENCVLIBS) -O3 -o congealReal congealReal.cpp

funnelReal: funnelReal.cpp
	g++ $(IFLAGS) $(LFLAGS) $(OPENCVLIBS) -O3 -o funnelReal funnelReal.cpp

проект

https://github.com/mrgloom/Unsupervised-joint-alignment-of-complex-images

версия Opencv 2.4.10

Изменено пользователем mrgloom

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может в legacy посмотреть ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

надо было так (т.е. либы указывать после)

 

congealReal: congealReal.cpp
    g++ $(IFLAGS) $(LFLAGS) -O3 -o congealReal congealReal.cpp $(OPENCVLIBS)

funnelReal: funnelReal.cpp
    g++ $(IFLAGS) $(LFLAGS) -O3 -o funnelReal funnelReal.cpp $(OPENCVLIBS)

 

но логику я не понял

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А зачем писать make'файлы?:-)

Не проще ли исопльзовать какую-нибудь систему автоматизации сборки типа cmake'а, который в opencv поддерживается из коробки?

Ну и да, использовать ANSI C интерфейсы в OpenCV настоятельно не рекомендуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Скрипты для поиска ф-ии

#To find function in headers

grep -n -r <function_name> <path_to_opencv_include_folder>
 
#To find function in libs

nm -C -A lib/*.so | grep <function_name> | grep -v U

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Видимо я совсем не настоящий линуксоид. Для разбора кода OpenCV открываю его в IDE (мой выбор QtCreator).

В крайнем случае, использую mc для поиска по файлам и просмотра результата.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну мой user case тут такой:

Поиск в хедерах чтобы понять что такая ф-ия есть в opencv, по идее можно еще и по сорцам искать, но я обычно использую поиск на гитхабе.

Поиск внутри либ для того чтобы понять какую либу надо включать для использования ф-ии, или можно не парится и включать вообще все либы opencv ? при линковке возьмется только нужное, размер файла не увеличится? т.е. тогда будет один Makefile на все проекты.

 

А вообще эта тема всплыла когда я пытался собирать легаси opencv проекты и была куча undefined reference на старые ф-ии, но дело было не в том, что они отсуствуют, а в том что в Makefile важен порядок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если ты нашёл функцию в хедере, то автоматически знаешь и что подключать, нет? Зачем что-то отдельно искать?

Я пользуюсь CMake и не парюсь по поводу порядка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну в хедере не написано как называется конкретная библиотека типа -lopencv_core

А как CMake облегчает жизнь? Можете скинуть template для opencv проекта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
cmake_minimum_required(VERSION 2.8)
set (PROJ_NAME RectangleFinder)
project(${PROJ_NAME})
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})


FIND_PACKAGE(OpenCV)

set(folder_source main.cpp
				  )

set(folder_header 
				   )

SOURCE_GROUP("Source Files" FILES ${folder_source})
SOURCE_GROUP("Header Files" FILES ${folder_header})
ADD_EXECUTABLE(${PROJ_NAME} ${folder_source} ${folder_header})
TARGET_LINK_LIBRARIES(${PROJ_NAME} ${OpenCV_LIBS} )

Я такой юзаю для быстрого создания проектов под VS.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как это работает

FIND_PACKAGE(OpenCV)

OpenCV должен быть установлен каким то специальным образом? на линуксе через apt-get?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Потестил в линуксе, работает как положено.

Я собирал OpenCV сам, все стандартно: git clone -> cmake ->  make ->  sudo make install.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 hours ago, mrgloom said:

Ну в хедере не написано как называется конкретная библиотека типа -lopencv_core

Я по названию хедера и пути к нему сразу понимаю из какого он модуля. То есть хедер от highgui явно не будет лежать в моделу core.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×