2016-03-24 5 views
1

Я использую autotools для создания библиотеки, которая включает в себя несколько пользовательских функций, которые основаны на opencv, которые я буду использовать в другом проекте.Autotools с openc (неопределенная ссылка)

Итак, сначала я построить эту библиотеку со следующей структурой:

src/ (all .cpp files) 
dpf-template/ (all .h files) 
test/ 
configure.ac 
Makefile.am 
dpf_template.pc.in 

configure.ac:

AC_PREREQ([2.69]) 

AC_INIT([calc_mean], [1.0]) 
AM_INIT_AUTOMAKE([foreign]) 
AM_MAINTAINER_MODE([enable]) 

AC_CONFIG_MACRO_DIR([m4]) 

# Checks for programs. 
AC_PROG_CXX 
AC_PROG_LIBTOOL 

#PKG_CHECK_MODULES([calc_mean]) 

AC_OUTPUT([Makefile 
    src/Makefile 
    test/Makefile 
    dpf_template.pc]) 

Makefile.am:

ACLOCAL_AMFLAGS = -I m4 

AUTOMAKE_OPTIONS = foreign 
SUBDIRS = src test 

pkgconfigdir = $(libdir)/pkgconfig 
pkgconfig_DATA = dpf_template.pc 

Src/Makefile.am

lib_LTLIBRARIES = libdpf_template.la 

libdpf_template_la_SOURCES = \ (plus all the files in src/*.cpp and dpf-template/*.h 

AM_LIBS = `pkg-config --libs opencv` 
AM_CPPFLAGS = -I$(top_srcdir) `pkg-config --cflags opencv` 
AM_CFLAGS = -g -Wall `pkg-config --cflags opencv` -I/usr/include/eigen3 
AM_CXXFLAGS=`pkg-config --cflags opencv` 

libdpf_templateincludedir = $(includedir)/dpf_template 
libdpf_templateinclude_HEADERS = \ (plus all the files in dpf-template/*.h) 

Я также видел, где opencv.pc, а затем проверяется, что он находится в PKG_CONFIG_PATH.

С этим я запускаю make и устанавливаю без ошибок. До сих пор так идти, но когда я построить простой проект, который включает в себя этот dpf_template.so (через .pc файл) и у меня есть только одна ошибка, которая

libdpf_template.so: undefined reference to `cv::meanShift(cv::_InputArray const&, cv::Rect_<int>&, cv::TermCriteria)' 
collect2: error: ld returned 1 exit status 

Если не я предложено что-то, когда я строю libdpf_template? Спасибо за помощь.

ответ

0

AM_LIBS Это не то, что вы думаете (применимо только к двоичным файлам), и вы не должны использовать pkg-config таким образом.

Вы должны использовать макрос PKG_CHECK_MODULES, чтобы определить OPENCV_LIBS и OPENCV_CFLAGS и указать эти переменные.

# in configure.ac 
PKG_CHECK_MODULES([OPENCV], [opencv]) 

# in Makefile.am 
AM_CFLAGS = -Wall 
AM_CPPFLAGS = $(OPENCV_CFLAGS) -I $(top_srcdir) -I /usr/include/eigen3 
libdpf_template_la_LIBADD = $(OPENCV_LIBS) 

Для получения дополнительной информации об использовании PKG_CHECK_MODULES, я могу направить вас к моему Autotools Mythbuster, что имеет полное объяснение.

+0

Я действительно решил это, добавив в src/Makefile.am AM_LDFLAGS = 'pkg-config --libs opencv' – aripod

+0

Возможно, это худшая идея. Да, это работает, для вас, но в большинстве дистрибутивов это сильно испортится, что обеспечит привязку '--as-needed'. У меня нет справки (я много писал об этом, но я не заметил, что в моем блоге хотя бы один), но порядок опций, заданных 'ld', важен, и передавая библиотеки на 'AM_LDFLAGS', они будут отброшены, когда компоновщик использует' -as-needed'. I * сильно * рекомендую вам сделать это правильно, как указано выше. –