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