C++ 带openc的自动工具(未定义的参考)

C++ 带openc的自动工具(未定义的参考),c++,opencv,makefile,autotools,automake,C++,Opencv,Makefile,Autotools,Automake,我正在使用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_AUTOM

我正在使用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_路径中

有了这些,我运行make和makeinstall时没有错误。到目前为止,但当我构建一个包含这个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.so:cv::meanShift(cv:_inputarrayconst&,cv::Rect&,cv::TermCriteria)的未定义引用
collect2:错误:ld返回了1个退出状态
当我构建libdpf_模板时,是否应该得到一些提示?
感谢您的帮助。

AM_LIBS
不是您想象的那样(仅适用于二进制文件),您不应该以这种方式使用
pkg config

您应该使用
PKG\u CHECK\u MODULES
宏定义
OPENCV\u LIBS
OPENCV\u 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\u CHECK\u模块的更多信息,请参阅我的,其中有完整的解释。

AM\u LIBS
不是您所认为的那样(仅适用于二进制文件),您不应该以这种方式使用
PKG config

您应该使用
PKG\u CHECK\u MODULES
宏定义
OPENCV\u LIBS
OPENCV\u 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\u CHECK\u模块的更多信息,请参阅我的,其中有完整的解释。

我实际上通过添加到src/Makefile.am am am\u LDFLAGS=
PKG config--libs opencv
解决了这个问题,这可能是一个更糟糕的想法。是的,它对您来说是有效的,但在大多数强制执行
——根据需要
链接的发行版上,它会严重失败。我手头没有参考资料(我写了很多关于这方面的文章,但我至少在我的博客中没有注意到这一点),但是
ld
的选项顺序很重要,通过将库传递给
AM\u LDFLAGS
,当链接器使用
——根据需要
,它们将被丢弃。我强烈建议您按照上面提到的那样正确执行。实际上,我通过添加到src/Makefile.am am am_LDFLAGS=
pkg config--libs opencv
解决了这个问题,这可能是一个更糟糕的主意。是的,它对您来说是有效的,但在大多数强制执行
——根据需要
链接的发行版上,它会严重失败。我手头没有参考资料(我写了很多关于这方面的文章,但我至少在我的博客中没有注意到这一点),但是
ld
的选项顺序很重要,通过将库传递给
AM\u LDFLAGS
,当链接器使用
——根据需要
,它们将被丢弃。我强烈建议你按照上面提到的那样正确地做。