C 将库添加到自动工具文件不起作用(链接器将忽略它)

C 将库添加到自动工具文件不起作用(链接器将忽略它),c,makefile,shared-libraries,autotools,C,Makefile,Shared Libraries,Autotools,关于C构建工具,我是个哑巴,所以我有一个分叉项目,我想在其中添加一个动态链接库: 基本上,我需要包括liblo。该项目的现有库中有各种各样的巫术(例如,netcdf) 我试着按照基本上说的,我应该在和Makefile.am中添加东西,然后运行autoeconf,autoconf,和automake,然后/配置,最后运行make 我将其添加到配置中。在中: # OSC support PKG_CHECK_MODULES(LIBLO, liblo >= 0.26) 我把它添加到Makefi

关于C构建工具,我是个哑巴,所以我有一个分叉项目,我想在其中添加一个动态链接库:

基本上,我需要包括
liblo
。该项目的现有库中有各种各样的巫术(例如,
netcdf

我试着按照基本上说的,我应该在
Makefile.am中添加东西,然后运行
autoeconf
autoconf
,和
automake
,然后
/配置
,最后运行
make

我将其添加到
配置中。在
中:

# OSC support
PKG_CHECK_MODULES(LIBLO, liblo >= 0.26)
我把它添加到
Makefile.am

bin_PROGRAMS = ncview

ncview_LDADD = $(LIBLO_LIBS)
现在,
configure
至少成功地检查了该库:

checking for LIBLO... yes
但是
make
似乎不包括带有链接器的库:

$ make
make  all-recursive
Making all in src
/usr/bin/gcc-4.2 -I/usr/X11/include -g -O2   -L/opt/local/lib -lnetcdf -lSM -lICE \
-L/usr/X11/lib -R/usr/X11/lib -lX11  -L/usr/X11/lib -R/usr/X11/lib  -Wl,-rpath,  -o \
ncview  ncview.o file.o util.o do_buttons.o file_netcdf.o view.o do_print.o \
epic_time.o interface.o x_interface.o dataedit.o display_info.o plot_xy.o utils.o \
range.o printer_options.o overlay.o filesel.o set_options.o plot_range.o udu.o \
SciPlot.o RadioWidget.o cbar.o utCalendar2_cal.o calcalcs.o colormap_funcs.o \
make_tc_data.o stringlist.o handle_rc_file.o   -lm -L/opt/local/lib -lnetcdf -lXaw \
-lXt  -L/usr/X11/lib -R/usr/X11/lib -lSM -lICE -L/usr/X11/lib -R/usr/X11/lib -lX11  \
-L/usr/X11/lib -R/usr/X11/lib  -lpng 

Undefined symbols:
  "_lo_address_new", referenced from:
      _main in ncview.o
  "_lo_send_internal", referenced from:
      _main in ncview.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
因此,它链接了旧库(
netcdf
X11
),但没有拾取我添加的库(
liblo

整个makefile业务对我来说都是黑魔法,所以任何关于该库没有链接的线索都是受欢迎的


解决方案

AC_SUBST
的提示下,再仔细观察一下其他库的集成方式,我成功地让它工作起来。无需将任何内容添加到
Makefile.am
。在
configure.In
(又称
configure.ac
)中,添加了以下内容:

# OSC support
PKG_CHECK_MODULES(LIBLO, liblo >= 0.26)
LIBSsave=$LIBS
CFLAGSsave=$CFLAGS
CFLAGS=$LIBLO_CFLAGS
LIBS=$LIBLO_LIBS
# AC_MSG_CHECKING([for liblo OSC library])
# AC_MSG_RESULT()
# AC_CHECK_LIB(LIBLO,lo_address_new,[],[libloWorks=no])
echo "liblo OSC library: $LIBLO_LIBS"
AC_SUBST(LIBLO_CFLAGS)  # si?
AC_SUBST(LIBLO_LIBS)
LIBS+=$LIBSsave
CFLAGS+=$CFLAGSsave

PKG_CHECK_模块
之后,应定义变量
LIBIO_CFLAGS
LIBIO_LIBS
。此时,您应该添加:

AC_SUBST(LIBIO_CFLAGS)
AC_SUBST(LIBIO_LIBS)
转到
configure.ac
文件。
Makefile.am
然后需要使用以下替换:

ncview_CPPFLAGS = $(LIBIO_CFLAGS)
ncview_LDADD = $(LIBIO_LIBS)

PKG_CHECK_模块
之后,应定义变量
LIBIO_CFLAGS
LIBIO_LIBS
。此时,您应该添加:

AC_SUBST(LIBIO_CFLAGS)
AC_SUBST(LIBIO_LIBS)
转到
configure.ac
文件。
Makefile.am
然后需要使用以下替换:

ncview_CPPFLAGS = $(LIBIO_CFLAGS)
ncview_LDADD = $(LIBIO_LIBS)

您还可以直接用以下语法替换LIBLO标志的值:

configure.ac:

  PKG_CHECK_MODULES(LIBLO, liblo >= 0.26)
Makefile.am:

  ncview_LDADD += @LIBLO_LIBS@
您还应该注意不要覆盖LDADD以前的值(或者反过来,这样会覆盖您的值)


应该给您一个警告,@LIBLO_LIBS@将无效。

您也可以直接用如下语法替换LIBLO标志的值:

configure.ac:

  PKG_CHECK_MODULES(LIBLO, liblo >= 0.26)
Makefile.am:

  ncview_LDADD += @LIBLO_LIBS@
您还应该注意不要覆盖LDADD以前的值(或者反过来,这样会覆盖您的值)


应该给你一个警告,@LIBLO_LIBS@将无效。

首先,如果指南仍然引用
configure.in
而不是,那么它已经过时了。@BrettHale-不,指南说“configure.ac,以前称为configure.in”,但在项目中,具体文件是“configure.in”,是的,它是一个旧项目(不是我自己写的)不幸的是,没有入门级的
configure.ac
。要完成任何有用的事情都需要大量的知识;或者通过查看大量现有的源代码,或者。您确定“+=”(例如
LIBS+=
)在您的解决方案中配置.in?首先,如果指南仍然引用的是
configure.in
而不是,那么它已经过时了。@BrettHale-否,指南上说的是“configure.ac,以前称为configure.in”,但在具体文件为“configure.in”的项目中,是的,它是一个旧项目(不是我自己编写的)不幸的是,没有入门级的
configure.ac
。要完成任何有用的事情,都需要大量的专业知识;或者通过查看大量现有的源代码,或者。您确定“+=”(例如
LIBS+=
)在您的解决方案中,configure.in?谢谢。我以前看到过那些
AC\u SUBST
调用。前缀方法仍然存在问题:
ncview
自动生成:警告:使用每个目标标志编译“ncview.c”需要在“configure.in”中使用“AM\u PROG\u CC\u c\O”。但是,我成功地完成了整个过程,并将更新qu估计。我将检查您的答案,因为我认为
AC\u SUBST
是关键。将
AM\u PROG\u CC\u C\u O
添加到您的配置中。为了消除警告(这就是它试图告诉您的:它需要configure.AC中的某个宏)谢谢。我以前看到过那些
AC\u SUBST
调用。前缀方法仍然存在问题:
ncview
自动生成:警告:使用每个目标标志编译“ncview.c”需要在“configure.in”中使用“AM\u PROG\u CC\u c\O”。但是,我成功地完成了整个过程并将更新问题。我将检查您的回答r、 因为我认为
AC_SUBST
是关键。将
AM_PROG\u CC\u C_O
添加到您的配置中。为了消除警告(这就是它试图告诉您的:它需要configure.AC中的某个宏)谢谢!和另一个答案一样,
ncview\uuu
前缀有问题。如果我将
=
更改为
+=
,automake只会说
+=
运算符只能在之前分配了值的情况下使用,但事实并非如此……但我最终可以使用
+=
(请参阅修正后的问题)谢谢!和另一个答案一样,
ncview\uuu
前缀有问题。如果我将
=
更改为
+=
,automake只会说
+=
运算符只能在之前分配了值的情况下使用,但事实并非如此……但我最终可以使用
+=
(请参阅修正后的问题)