我使用autotools构建了一个库,其中包含了几个基于我将在另一个项目中使用的opencv的自定义函数。
首先,我使用以下结构构建此库:
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和make install没有错误。到目前为止,但是当我构建一个包含此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 :(得分: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进行全面解释。