【问题标题】:Adding a library to autotools files does not work (linker ignores it)将库添加到 autotools 文件不起作用(链接器忽略它)
【发布时间】:2013-01-17 16:03:57
【问题描述】:

我是 C 构建工具的傻瓜,所以我有一个分叉项目,我想向其中添加一个动态链接库:

https://github.com/iem-projects/ncview/tree/26c3549d165dc6047dc37db252062fd73eb9282c

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

我正在尝试关注this manual,它基本上说,我应该向configure.inMakefile.am 添加内容,然后运行autoreconfautoconfautomake,然后运行./configure,最后运行@ 987654333@.

这是我添加到configure.in

# 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

所以它链接了旧库(netcdfX11),但没有选择我添加的库(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

【问题讨论】:

  • 首先,如果一个指南仍然提到configure.in而不是configure.ac,那它已经过时了。
  • @BrettHale - 不,指南说“configure.ac,以前称为configure.in”,但在项目中具体文件是“configure.in”,是的,它是一个旧项目(不是我自己写的)
  • 不幸的是,没有入门级configure.ac。完成任何有用的事情都需要大量的专业知识;通过查看大量现有资源或better tutorials.
  • 你确定你的 solution-configure.in 中的“+=”(例如LIBS+=)吗?

标签: c makefile shared-libraries autotools


【解决方案1】:

PKG_CHECK_MODULES之后,应该定义变量LIBIO_CFLAGSLIBIO_LIBS。此时,您应该添加:

AC_SUBST(LIBIO_CFLAGS)
AC_SUBST(LIBIO_LIBS)

configure.ac 文件。 Makefile.am 然后需要使用这些替换:

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

【讨论】:

  • 谢谢。我以前看过那些AC_SUBST 电话。 ncview_ 前缀方法仍然存在问题:automake: warning: compiling 'ncview.c' with per-target flags requires 'AM_PROG_CC_C_O' in 'configure.in'。但是,我设法让整个事情顺利进行,并将更新问题。我会检查你的答案,因为我认为AC_SUBST 是关键。
  • AM_PROG_CC_C_O 添加到您的 configure.in 以消除警告(这是它试图告诉您的:它需要在 configure.ac 中的某个位置使用此宏)
【解决方案2】:

你也可以直接用如下语法替换 LIBLO-flags 的值:

配置.ac:

  PKG_CHECK_MODULES(LIBLO, liblo >= 0.26)

Makefile.am:

  ncview_LDADD += @LIBLO_LIBS@

您还应该注意不要覆盖以前的 LDADD 值(或相反,因此您的值会被覆盖)

  ncview_LDADD = @LIBLO_LIBS@
  ncview_LDADD = -lm

应该给你一个警告,@LIBLO_LIBS@ 将不起作用。

【讨论】:

  • 谢谢!与其他答案一样,ncview_ 前缀存在问题。如果我将= 更改为+=,automake 只会说+= 运算符只有在分配了先前的值时才能使用,但事实并非如此。
  • ...但我最终可以使用+=(请参阅修改后的问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
相关资源
最近更新 更多