我想将我从linux编写的c ++程序移植到mac,其中包括共享库项目。我使用gnu automake来做构建。现在我有很多问题阻止我使用automake在mac上构建我的程序。
我做了多少努力:
以下是我可以描述的一些问题:
首先要让共享库建立起来。我在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'
答案 0 :(得分:2)
您的问题是ifeq
... endif
makefile语法由于缩进而无法在automake
中工作。 This answer显示了uname
中处理configure.ac
个案例的更可靠方式。
我对自制软件并不熟悉。自制软件是否也像本机OS X GNU Libtool一样调用libtool
和glibtool
以及libtoolize
和glibtoolize
?
无论如何,在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软件包可能没问题,但我再也没有任何经验,所以我真的无法肯定地说。