在Mac / OS X上使用gnu autotools构建用c ++编写的共享库?
我想移植一个从linux写入到mac的c ++程序,其中包括共享库项目。 我使用gnu automake来完成构建任务。 现在我有很多问题阻止我使用automake在mac上构建我的程序。
我做了什么努力:
以下是我可以描述的一些问题:
首先要让共享库被构建。 我发现在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一样调用libtool
和glibtool
并进行libtoolize
和glibtoolize
?
无论如何,在Makefile.am
设置LIBTOOL
为时已晚。 它需要通过调用libtoolize
的autoreconf
来处理,其中写入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?