I want to port a c++ program I wrote from linux to mac, which including shared library projects. I used gnu automake to do the build things. Now I have many issues stop me from using automake to build my program on mac.
What effort I have made:
- Installed xcode 5.1.1 and its command line tools(looks like it not helpful, it doesn't have automake)
- Installed automake libtool manually by homebrew
- Followed a typical automake workflow: autoscan, autoconf, aclocal, automake, configure, make... then a bunch of errors appeared.
- Searched in google heaps, no complete tutorial about this particular task was found.
Here is some issues I can describe:
The first thing is to let the shared lib to be built. I found the libtool name is 'glibtool' on mac, so I need to use glibtool instead of libtool, I put this: LIBTOOL=glibtool in Makefile.am do the trick. And I also need to check OS let it only do this for Darwin system. The following should work in shell but seems not working for Makefile.am:
ifeq ($(OS), Windows_NT)
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Darwin)
LIBTOOL = glibtool
endif
endif
It will lead to "error:else without if". Not sure how to achieve this?
The left is the generated Makefile basically not working. Typing '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' is not a valid libtool object
Missing .lo files, looks like it doesn't compile .cpp into .lo. I tried to work around by running the g++ statement manually, it can help to generate .lo. I end up by this error:
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 file or directory: '/usr/local/lib/rwd/libdictcn.0.dylib'
I spent much time searching on internet but doesn't help much. The documentation of Apple's official site is not very helpful to solving gnu autotools usage problems on mac.
The complete source code can be found by this:
git clone http://git.code.sf.net/p/rdwtwdb/gitcode rdwtwdb-gitcode
I am using OS X Mavericks v10.9.2. Thanks for any advice.
Add more information to help asking why I cannot build .lo
when typing make
under the library folder, Makefile has been generated by using glibtool
When typing make
under the library fold, it complains .lo
files are missing:
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
But the way to build .lo
has been given in the output. Why it doesn't use it to build .lo
?
I looked into Makefile itself, found the rule to build .lo
is this:
.cpp.lo:
$(AM_V_CXX)source='$<' object='$@' libtool=yes \
DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
$(AM_V_CXX_no)$(LTCXXCOMPILE) -c -o $@ $<
Final target is to build .la
file successfully
Despite of the previous issue, I can build .lo
manually. It's not too bad if I can half-automake the project. But when I trying to build the last .la
, this missing .dylib
error stop me from doing that:
/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'
ifneq
instead ofifeq
followed directly byelse
? – ptomato