构建共享库,用 c++ 编写,在 Mac/OS X 上使用 gnu autotools



我想将我编写的 c++ 程序从 linux 移植到 mac,其中包括共享库项目。我使用 gnu automake 来做构建的事情。现在我有很多问题阻止我在 mac 上使用自动制作来构建我的程序。

我做了什么努力:

  1. 安装了 xcode 5.1.1 及其命令行工具(看起来没有帮助,它没有自动制作(
  2. 通过自制软件手动安装自动制作库工具
  3. 遵循典型的自动制作工作流程:自动扫描、自动协商、本地、自动制作、配置、制作...然后出现了一堆错误。
  4. 在谷歌堆中搜索,没有找到有关此特定任务的完整教程。

以下是我可以描述的一些问题:

第一件事是让共享库被构建。我发现 libtool 名称在 mac 上是"glibtool",所以我需要使用 glibtool 而不是 libtool,我把这个: LIBTOOL=glibtool在 Makefile.am 做这个伎俩。我还需要检查操作系统,让它只为达尔文系统执行此操作。以下内容应该在 shell 中工作,但似乎不适用于 Makefile.am:

ifeq ($(OS), Windows_NT)
else
    UNAME_S := $(shell uname -s)
    ifeq ($(UNAME_S), Darwin)
        LIBTOOL = glibtool
    endif
endif

这将导致"错误:否则没有如果"。不确定如何实现此目的?

左边是生成的生成文件基本上不起作用。输入"制作":

光盘../..&&/bin/sh/Users/viewpl/lab/rdwtwdb-git-code/rdwtwdb/missing automake-1.14 --gnu plugin/dictcn/Makefile 源='../../rwd_util.cpp' 对象='../../rwd_util.lo' libtool=yes \ DEPDIR=.deps depmode=none/bin/sh ../../depcomp \ glibtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I/usr/include/-I/usr/include/libxml2/-I/usr/local/opt/libxml2/include/libxml2/-I/usr/local/opt/readline/include -I/usr/local/include/-iquote../../include/-iquote../../-g -O2 -c -o ../../rwd_util.lo ../../rwd_util.cpp glibtool --tag=CXX --mode=link g++ -g -O2 -rpath/usr/local/bin/plugin/-o libdictcn.la -rpath/usr/local/lib/rwd dictcn.lo ../../rwd_util.lo -liconv -lltdl -lz -lxml2 -lreadline -lpthread -lportaudio -ldl -lcurl glibtool: link: '../../rwd_util.lo' 不是有效的 libtool 对象

缺少 .lo 文件,看起来它无法.cpp编译为 .lo。我试图通过手动运行 g++ 语句来解决,它可以帮助生成 .lo。我最终遇到此错误:

glibtool: link: c++ -dynamiclib -wl,-undefined -wl,dynamic_lookup -o .libs/libdictcn.0.dylib .libs/dictcn.o ../../.libs/rwd_util.o -liconv -lltdl -lz -lxml2 -lreadline -lpthread -lportaudio -ldl -lcurl -O2 -install_name/usr/local/bin/plugin//usr/local/lib/rwd/libdictcn.0.dylib -compatibility_version 1 -current_version 1.0 -wl,-single_module clang: error: no such文件或目录: '/usr/local/lib/rwd/libdictcn.0.dylib'

我花了很多时间在互联网上搜索,但没有多大帮助。苹果官方网站的文档对于解决 mac 上的 gnu autotools 使用问题不是很有帮助。

完整的源代码可以通过以下方式找到:

git clone http://git.code.sf.net/p/rdwtwdb/gitcode rdwtwdb-gitcode

我正在使用OS X Mavericks v10.9.2。感谢您的任何建议。


添加更多信息以帮助询问为什么在库文件夹下键入make时无法构建.lo,Makefile 是使用 glibtool 生成的

在库折叠下键入make时,它会抱怨.lo文件丢失:

source='dictcn.cpp' object='dictcn.lo' libtool=yes 
    DEPDIR=.deps depmode=none /bin/sh ../../depcomp 
    /bin/sh ../../libtool  --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H    -I/usr/include/ -I/usr/include/libxml2/ -I/usr/local/opt/libxml2/include/libxml2/ -I/usr/local/opt/readline/include -I/usr/local/include/ -iquote../../include/ -iquote../../   -g -O2 -c -o dictcn.lo dictcn.cpp
source='../../rwd_util.cpp' object='../../rwd_util.lo' libtool=yes 
    DEPDIR=.deps depmode=none /bin/sh ../../depcomp 
    /bin/sh ../../libtool  --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H    -I/usr/include/ -I/usr/include/libxml2/ -I/usr/local/opt/libxml2/include/libxml2/ -I/usr/local/opt/readline/include -I/usr/local/include/ -iquote../../include/ -iquote../../   -g -O2 -c -o ../../rwd_util.lo ../../rwd_util.cpp
/bin/sh ../../libtool  --tag=CXX   --mode=link g++  -g -O2  -rpath /usr/local/bin/plugin/  -o libdictcn.la -rpath /usr/local/lib/rwd dictcn.lo ../../rwd_util.lo  -liconv -lltdl -lz -lxml2 -lreadline -lpthread -lportaudio -ldl -lcurl 
libtool: link: `dictcn.lo' is not a valid libtool object
make: *** [libdictcn.la] Error 1

但是构建.lo的方法已经在输出中给出。为什么它不使用它来构建.lo?我研究了Makefile本身,发现构建.lo的规则是这样的:

.cpp.lo:
    $(AM_V_CXX)source='$<' object='$@' libtool=yes 
    DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) 
    $(AM_V_CXX_no)$(LTCXXCOMPILE) -c -o $@ $<

最终目标是成功构建.la文件

尽管有上一个问题,但我可以手动构建.lo。如果我能半自动制作项目,那还不错。但是当我尝试构建最后一个.la时,这个缺失的.dylib错误阻止我这样做:

/bin/sh ../../libtool  --tag=CXX   --mode=link g++  -g -O2  -rpath /usr/local/bin/plugin/  -o libdictcn.la -rpath /usr/local/lib/rwd dictcn.lo ../../rwd_util.lo  -liconv -lltdl -lz -lxml2 -lreadline -lpthread -lportaudio -ldl -lcurl 
libtool: link: warning: ignoring multiple `-rpath's for a libtool library
libtool: link: g++ -dynamiclib -Wl,-undefined -Wl,dynamic_lookup -o .libs/libdictcn.0.dylib  .libs/dictcn.o ../../.libs/rwd_util.o   -liconv -lltdl -lz -lxml2 -lreadline -lpthread -lportaudio -ldl -lcurl  -O2   -install_name  /usr/local/bin/plugin/ /usr/local/lib/rwd/libdictcn.0.dylib -compatibility_version 1 -current_version 1.0 -Wl,-single_module
clang: error: no such file or directory: '/usr/local/lib/rwd/libdictcn.0.dylib'

你的问题是ifeq...由于缩进,endif生成文件语法在automake中不起作用。 这个答案显示了在configure.ac中处理uname案例的更可靠方法。

我对自制软件不太熟悉。 自制软件是否也像原生的OS X GNU Libtool一样调用libtoolglibtoollibtoolizeglibtoolize

无论如何,在Makefile.am设立LIBTOOL为时已晚。 它需要由调用libtoolize写入libtool.m4autoreconf处理(configure编写的libtool模板(。 如果是这种情况,这样的事情可能会起作用:

LIBTOOLIZE=glibtoolize autoreconf -fvi 

每当我必须使用GNU构建系统在OS X上构建时,我都会安装所有的自动工具。 OS X自动工具总是很古老,在OS X上无法使用。 自制的libtools包可能没问题,但我对它们没有任何经验,所以我真的不能肯定地说。

最新更新