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

时间:2014-05-17 15:37:55

标签: macos autotools automake

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

我做了多少努力:

  1. 已安装xcode 5.1.1及其命令行工具(看起来没用,但没有自动化)
  2. 通过自制软件
  3. 手动安装了automake libtool
  4. 遵循典型的automake工作流程:autoscan,autoconf,aclocal,automake,configure,make ...然后出现了一堆错误。
  5. 在google堆中搜索,找不到关于此特定任务的完整教程。
  6. 以下是我可以描述的一些问题:

    首先要让共享库建立起来。我在mac上发现libtool名称是'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
    

    这将导致“错误:否则没有”。不知道如何实现这个目标?

    左边是生成的Makefile基本不起作用。输入'make':

      

    cd ../ ..&& / bin / sh / Users / viewpl / lab / rdwtwdb-git-code / rdwtwdb / missing automake-1.14 --gnu plugin / dictcn / Makefile   source ='.. / .. / rwd_util.cpp'object ='.. / .. / 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:错误:没有这样的文件或目录:'/ usr / local / lib / rdd / libdictcn.0.dylib'

    我花了很多时间在互联网上搜索,但没有多大帮助。 The documentation of Apple's official site对解决mac上的gnu autotools使用问题没有多大帮助。

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

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

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


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

    在库折叠下输入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'
    

1 个答案:

答案 0 :(得分:2)

您的问题是ifeq ... endif makefile语法由于缩进而无法在automake中工作。 This answer显示了uname中处理configure.ac个案例的更可靠方式。

我对自制软件并不熟悉。自制软件是否也像本机OS X GNU Libtool一样调用libtoolglibtool以及libtoolizeglibtoolize

无论如何,在LIBTOOL中设置Makefile.am为时已晚。它需要由autoreconf来处理,libtoolize会调用libtool.m4来编写libtool(由configure写的LIBTOOLIZE=glibtoolize autoreconf -fvi 的模板)。如果是这样的话,这样的事情就可以了:

{{1}}

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