2016-03-24 1 views
1

J'utilise autotools pour construire une bibliothèque qui incorpore plusieurs fonctions personnalisées basées sur opencv que j'utiliserai dans un autre projet.Autotools avec openc (référence indéfinie)

Alors d'abord je construire cette bibliothèque avec la structure suivante:

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) 

J'ai également vu où opencv.pc est et ensuite vérifié qu'il est dans PKG_CONFIG_PATH. Avec ceux-ci, je lance make et make install sans erreur. Alors, allez donc loin, mais quand je construis un projet simple qui comprend ce dpf_template.so (par fichier .pc) et je n'ai qu'une erreur qui est

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

je ne devrais pas avoir été invité quelque chose quand je construis le libdpf_template? Merci pour l'aide.

Répondre

0

AM_LIBS n'est pas ce que vous pensez qu'il est (ne s'applique qu'aux binaires), et vous ne devriez pas utiliser pkg-config de cette façon.

Vous devez utiliser la macro PKG_CHECK_MODULES pour définir OPENCV_LIBS et OPENCV_CFLAGS et faire référence à ces variables.

# 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) 

Pour plus d'informations sur l'utilisation PKG_CHECK_MODULES, je peux vous référer à mon Autotools Mythbuster qui a une explication complète de celui-ci.

+0

J'ai effectivement résolu cela en ajoutant à src/Makefile.am AM_LDFLAGS = 'pkg-config --libs opencv' – aripod

+0

C'est peut-être une pire idée. Oui, cela fonctionne, pour vous, mais cela échouera sur la plupart des distributions qui appliquent la liaison '-as-needed'. Je n'ai pas de référence à portée de main (j'ai beaucoup écrit à ce sujet, mais je n'ai pas noté ça dans mon blog au moins) mais l'ordre des options données à 'ld' est important, et en passant les bibliothèques à 'AM_LDFLAGS', ils seront rejetés lorsque l'éditeur de liens utilise' --as-needed'. Je * fortement * vous recommande de le faire correctement comme indiqué ci-dessus. –