2016-03-24 20 views
1

Başka bir projede kullanacağım opencv temelli birkaç özel işlev içeren bir kitaplık oluşturmak için autotools kullanıyorum.openc ile Autotools (tanımsız başvuru)

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

Bu nedenle ilk önce aşağıdaki yapıya sahip bu kütüphane kurmak

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) 

Ayrıca opencv.pc'in nerede olduğunu gördükten sonra PKG_CONFIG_PATH içinde olduğunu kontrol ettim.

Bunlar ile hata yapmadan yükleme ve yükleme işlemini çalıştırıyorum. Buraya kadar her şey gider, ama ben (.pc dosyası üzerinden) bu dpf_template.so içeren basit bir proje oluşturmak ve ne zaman ı oluştururken

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

şey istenmiş gerekmiyor sadece bir hata var libdpf_template? Yardım için teşekkürler.

cevap

0

AM_LIBS, (yalnızca ikili dosyalar için geçerlidir) olduğunu düşündüğünüz değil ve pkg-config'u bu şekilde kullanmamalısınız.

PKG_CHECK_MODULES makrosunu, OPENCV_LIBS ve OPENCV_CFLAGS tanımlamak için kullanın ve bu değişkenlere başvurun. Daha fazla bilgi için

# 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 kullanımı hakkında, bundan tam bir açıklama kargo benim Autotools Mythbuster sevk edebilir.

+0

Bunu gerçekten src/Makefile.am ekleyerek çözdüm AM_LDFLAGS = 'pkg-config --libs opencv' – aripod

+0

Bu muhtemelen daha kötü bir fikir. Evet, sizin için çalışıyor, ancak '--as-need' bağlantısını zorlayan dağıtımların çoğunda kötü bir şekilde başarısız olur. Elimde bir referansım yok (bununla ilgili çok şey yazdım, ancak blogumda en az bir kere not almamıştım) ancak ld'ye verilen seçeneklerin sırası önemlidir ve kütüphaneleri "AM_LDFLAGS", linker '--as-needed 'kullanıldığında atılacaklar. I * şiddetle * yukarıda belirtildiği gibi düzgün bir şekilde yapmanızı öneririz. –

İlgili konular