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

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

我做了什么努力:

  • 安装了xcode 5.1.1及其命令行工具(看起来没有帮助,它没有automake)
  • 通过自制软件手动安装automake libtool
  • 遵循典型的automake工作流程:autoscan,autoconf,aclocal,automake,configure,make ...然后出现一堆错误。
  • 搜索google堆,没有找到关于这个特定任务的完整教程。
  • 以下是我可以描述的一些问题:

    首先要让共享库被构建。 我发现在Mac上libtool的名字是'glibtool',所以我需要使用glibtool而不是libtool,我把这个:LIBTOOL = glibtool放在Makefile.am中。 而且我还需要检查OS,让它只对达尔文系统执行此操作。 以下应该在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 / -etote ../../ 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铿锵声:错误:没有这样的文件或目录:'/usr/local/lib/rwd/libdictcn.0.dylib'

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

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

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

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


    添加更多的信息,帮助问我为什么不能建立.lo打字的时候make的库文件夹下生成文件已通过使用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 makefile语法在automake不起作用。 这个答案显示了在configure.ac中处理uname情况的更可靠的方法。

    我不熟悉自制软件。 自制软件是否也像本地OS X GNU Libtool一样调用libtoolglibtool并进行libtoolizeglibtoolize

    无论如何,在Makefile.am设置LIBTOOL为时已晚。 它需要通过调用libtoolizeautoreconf来处理,其中写入libtool.m4 (由configure编写的libtool的模板)。 如果是这样的话,像这样的东西可以工作:

    LIBTOOLIZE=glibtoolize autoreconf -fvi 
    

    无论何时我必须使用GNU构建系统构建OS X,我都会安装所有的自动工具。 OS X自动工具在OS X上总是古老而且无法使用。自制的libtools软件包可能没问题,但我对它们又没有任何经验,所以我确实无法确定。

    链接地址: http://www.djcxy.com/p/54921.html

    上一篇: Build shared library,written in c++, by using gnu autotools on Mac/OS X?

    下一篇: How to use debug version of libc