2016-03-24 6 views
1

Ich verwende Autotools, um eine Bibliothek zu erstellen, die mehrere benutzerdefinierte Funktionen enthält, die auf opencv basieren, das ich in einem anderen Projekt verwenden werde.Autotools mit openc (undefined Referenz)

Also zuerst baue ich diese Bibliothek mit folgenden Struktur:

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) 

Ich sah auch, wo opencv.pc ist und dann überprüft, dass es in PKG_CONFIG_PATH ist.

Mit diesen starte ich make und make install ohne Fehler. So weit, so gehen, aber wenn ich ein einfaches Projekt erstellen, das diese dpf_template.so (durch .pc-Datei) enthält, und ich habe nur einen Fehler, ist

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

Habe ich nicht etwas aufgefordert worden, wenn ich baue die libdpf_template? Danke für die Hilfe.

Antwort

0

AM_LIBS ist nicht, was Sie denken, es ist (gilt nur für Binärdateien), und Sie sollten pkg-config nicht auf diese Weise verwenden.

Sie sollten das Makro PKG_CHECK_MODULES verwenden, um OPENCV_LIBS und OPENCV_CFLAGS zu definieren und diese Variablen zu referenzieren.

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

Weitere Informationen zur Verwendung von PKG_CHECK_MODULES, kann ich Ihnen meine Autotools Mythbuster beziehen, die eine vollständige Erklärung von ihm hat.

+0

Ich löste das tatsächlich durch Hinzufügen zu src/Makefile.am AM_LDFLAGS = 'pkg-config --libs opencv' – aripod

+0

Das ist möglicherweise eine schlechtere Idee. Ja, es funktioniert, für Sie, aber es wird auf den meisten Distributionen, die die '' als-benötigt-Verknüpfung erzwingen, schlecht ausfallen. Ich habe keine Referenz zur Hand (ich schrieb viel darüber, aber ich habe nicht bemerkt, dass eine unten in meinem Blog mindestens), aber die Reihenfolge der Optionen zu "ld" ist wichtig, und durch die Übergabe von Bibliotheken zu 'AM_LDFLAGS' werden verworfen, wenn der Linker' --as-needed' verwendet. Ich empfehle Ihnen dringend, es richtig zu tun, wie oben erwähnt. –