Здравствуйте.
Пишу проект с использованием библиотек типа shared
MAKEFILE
TAXIINCLUDE=include
TAXILIB=lib
PROPERTY=property.conf
CXX := g++ -DIBPP_LINUX -Wl,-rpath,/usr
CXXFLAGS := -I./include/boost -I/usr/local/cppconn -I/usr/include/ibpp
LDFLAGS := -L./boost/lib -L/usr/lib -lmysqlcppconn -lboost_date_time -lboost_program_options-mt
PROGRAM_NAME := taxi
OBJECT_FILES := $(TAXILIB)/libtaxifinance.so $(TAXILIB)/libtaxifuncs.so $(TAXILIB)/libtaxiconf.so $(TAXILIB)/libtaxistats.so $(TAXILIB)/libtaxipenalty.so $(PROGRAM_NAME).o
HEADS := $(TAXIINCLUDE)/libtaxiconf.h $(TAXIINCLUDE)/libtaxifinance.h $(TAXIINCLUDE)/libtaxifuncs.h $(TAXIINCLUDE)/libtaxistats.h $(TAXIINCLUDE)/libtaxipenalty.h
HEADS := $(TAXIINCLUDE)/
LIBS := -ltaxifinance -ltaxifuncs -ltaxiconf -ltaxistats -ltaxipenalty -libpp
$(PROGRAM_NAME): $(OBJECT_FILES)
$(CXX) $(CXXFLAGS) -o $@ $^ -L$(TAXILIB) $(LIBS)
#taxi.o: taxi.cpp $(TAXIINCLUDE)/libtaxi.h $(TAXIINCLUDE)/libtaxifinance.h $(TAXIINCLUDE)/libtaxifunc.h $(TAXIINCLUDE)/libtaxistats.h $(TAXIINCLUDE)/libtaxipenalty.h
# $(CXX) $(CXXFLAGS) -c taxi.cpp
taxi.o: taxi.cpp $(HEADS)
$(CXX) $(CXXFLAGS) -c taxi.cpp
$(TAXILIB)/libtaxiconf.so: $(TAXILIB)/libtaxiconf.cpp $(TAXIINCLUDE)/libtaxiconf.h
$(CXX) -fPIC $(CXXFLAGS) $(LDFLAGS) -c $(TAXILIB)/libtaxiconf.cpp -o $(TAXILIB)/libtaxiconf.o -I $(TAXIINCLUDE)/
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -Wl,-soname,$(TAXILIB)/libtaxiconf.so -o $(TAXILIB)/libtaxiconf.so $(TAXILIB)/libtaxiconf.o
$(TAXILIB)/libtaxifinance.so: $(TAXILIB)/libtaxifinance.cpp $(TAXIINCLUDE)/libtaxifinance.h
$(CXX) -fPIC $(CXXFLAGS) $(LDFLAGS) -c $(TAXILIB)/libtaxifinance.cpp -o $(TAXILIB)/libtaxifinance.o -I $(TAXIINCLUDE)/
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -Wl,-soname,$(TAXILIB)/libtaxifinance.so -o $(TAXILIB)/libtaxifinance.so $(TAXILIB)/libtaxifinance.o
$(TAXILIB)/libtaxifuncs.so: $(TAXILIB)/libtaxifuncs.cpp $(TAXIINCLUDE)/libtaxifuncs.h
$(CXX) -fPIC $(CXXFLAGS) $(LDFLAGS) -c $(TAXILIB)/libtaxifuncs.cpp -o $(TAXILIB)/libtaxifuncs.o -I $(TAXIINCLUDE)/
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -Wl,-soname,$(TAXILIB)/libtaxifuncs.so -o $(TAXILIB)/libtaxifuncs.so $(TAXILIB)/libtaxifuncs.o
$(TAXILIB)/libtaxistats.so: $(TAXILIB)/libtaxistats.cpp $(TAXIINCLUDE)/libtaxistats.h
$(CXX) -fPIC $(CXXFLAGS) $(LDFLAGS) -c $(TAXILIB)/libtaxistats.cpp -o $(TAXILIB)/libtaxistats.o -I $(TAXIINCLUDE)/
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -Wl,-soname,$(TAXILIB)/libtaxistats.so -o $(TAXILIB)/libtaxistats.so $(TAXILIB)/libtaxistats.o
$(TAXILIB)/libtaxipenalty.so: $(TAXILIB)/libtaxipenalty.cpp
$(CXX) -fPIC $(CXXFLAGS) $(LDFLAGS) -c $(TAXILIB)/libtaxipenalty.cpp -o $(TAXILIB)/libtaxipenalty.o -I $(TAXIINCLUDE)/
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -Wl,-soname,$(TAXILIB)/libtaxipenalty.so -o $(TAXILIB)/libtaxipenalty.so $(TAXILIB)/libtaxipenalty.o
install:
cp -fR ./taxi /usr/bin/
cp -fR $(TAXIINCLUDE)/*.h /usr/include/
cp -fR $(TAXILIB)/*.so /usr/lib/
config:
mkdir -p /etc/taxi
cp -i $(PROPERTY) /etc/taxi/
clean:
rm -f *.so $(TAXILIB)/*.so
rm -fR *.o $(TAXILIB)/*.o
rm -fR *.o *.o
rm -f *.out
rm -f $(PROGRAM_NAME)
После выполнения компиляции делаю make install и ldconfig
выдается ошибка при выполнении ldconfig
ldconfig: Невозможно создать ссылку с /usr/lib/lib/libtaxifinance.so на libtaxifinance.so
ldconfig: Невозможно создать ссылку с /usr/lib/lib/libtaxipenalty.so на libtaxipenalty.so
ldconfig: Невозможно создать ссылку с /usr/lib/lib/libtaxistats.so на libtaxistats.so
ldconfig: Невозможно создать ссылку с /usr/lib/lib/libtaxiconf.so на libtaxiconf.so
ldconfig: Невозможно создать ссылку с /usr/lib/lib/libtaxifuncs.so на libtaxifuncs.so
при вызове с командной строки taxi - все работает...
но если же я вызываю через crontab мне приходит письмо с ошибкой
taxi: error while loading shared libraries: lib/libtaxifinance.so: cannot open shared object file: No such file or directory
Что не так делаю.
Подскажите, пожалуйста. Заранее спасибо.
Отправлять читать книги не, отправляйте - читал, все делаю как там написано.
Shared library
taxi: error while loading shared libraries: lib/libtaxifinance.so: cannot open shared object file: No such file or directory
а покажите строку crontab'a ?
а еще http://www.ulitka.com/unix/error_while_loading_shared_libraries-13508.html =)
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/lib:/var/lib
MAILTO="admin@taxi27.ru"
40 * * * * taxi statscall hourly
:) мои библиотеки копируются в папку /usr/lib
я сижу под рутом
40 * * * * taxi statscall hourly
все же следует указать /usr/bin/taxi statscall hourly
p.s. statscall hourly а это что? =) что то не догнал малость :rolleyes:
это я передаю программе какие задачи выполнять :) собрать статистику почасовую по звонкам :) и положить в базу - типа ARGV
но если же я вызываю через crontab мне приходит письмо с ошибкой
я не понял, вы вызываете make через crond? oO
/usr/bin/taxi: error while loading shared libraries: lib/libtaxifinance.so: cannot open shared object file: No such file or directory
[quote=vscorpion]но если же я вызываю через crontab мне приходит письмо с ошибкой
я не понял, вы вызываете make через crond? oO[/quote]
:) я вызываю свою программу а не мейк :) мейк то зачем
это я передаю программе какие задачи выполнять smile собрать статистику почасовую по звонкам smile и положить в базу - типа ARGV
если я правильно понял, если выполнить taxi с ключами statcall hourly в cli то она корректно отработает? дык, вроде бы crontab ключи то эти не понимает.
taxi: error while loading shared libraries: lib/libtaxifinance.so: cannot open shared object file: No such file or directory
дык правильно - разве у вас либы в lib/ ?
как я понимаю, рабочий каталог вы не задали, потому taxi ищет либы в /lib/, а у вас они в /usr/lib/
/usr/bin/taxi: error while loading shared libraries: lib/libtaxifinance.so: cannot open shared object file: No such file or directory
http://linuxforum.ru/viewtopic.php?pid=133236#p133236 там 2я ссылка =)
выдается ошибка при выполнении ldconfig
значит не смогла она либы сделать. точнее ссылки на них.
попробуйте
[console]ldconfig --verbose [/console]
lib/libtaxifuncs.so -> libtaxifuncs.soldconfig: Невозможно создать ссылку с /usr/lib/lib/libtaxifuncs.so на libtaxifuncs.so
может я в мейкфайле чтото не так делаю?
иерархия моего проекта
include - папка с файлами *.h
lib - библиотеки shared
makefile
taxi.cpp
как мне скомпилить так чтоб все было на своих местах и исходники и сами скомпиленные файлы с верными путями?
cp -fR $(TAXILIB)/*.so /usr/lib/
т.е. вы копируете ./lib/*.so в /usr/lib/, но затем ищете либы в /usr/lib/lib/, а не в /usr/lib/.
$(CXX) $(CXXFLAGS) -o $@ $^ -L$(TAXILIB) $(LIBS)
видимо эта строчка заставляет искать программу ldconfig в каталоге lib/, что для последней эквивалентно /usr/lib/lib/ (а если вы в текущем каталоге, то всё работает, ведь у вас там либы остались в ./lib/ )
самое простое и костыльное решение - наделать симлинков вида
[console]ln -sf /usr/lib/libtaxifinance.so /lib/[/console]
криво конечно, но работать должно, если у вас текущий каталог - корень (как обычно бывает в crond)
Ну или разбирайтесь с путями... Там у вас много непонятного, сходу и не сообразить :(
[quote=vscorpion]cp -fR $(TAXILIB)/*.so /usr/lib/
т.е. вы копируете ./lib/*.so в /usr/lib/, но затем ищете либы в /usr/lib/lib/, а не в /usr/lib/.
$(CXX) $(CXXFLAGS) -o $@ $^ -L$(TAXILIB) $(LIBS)
видимо эта строчка заставляет искать программу ldconfig в каталоге lib/, что для последней эквивалентно /usr/lib/lib/ (а если вы в текущем каталоге, то всё работает, ведь у вас там либы остались в ./lib/ )[/quote]
а как мн етогда компилить?
убрал $(TAXILIB) все равно ldconfig ругается и ищет в /usr/lib/lib
а как мн етогда компилить?
ну наверное самое простое - не использовать относительные пути, а использовать абсолютные. ваше беда в том, что у вас TAXILIB=lib на практике имеет три разных значения (даже четыре).
[quote=vscorpion]а как мн етогда компилить?
ну наверное самое простое - не использовать относительные пути, а использовать абсолютные. ваше беда в том, что у вас TAXILIB=lib на практике имеет три разных значения (даже четыре).[/quote]
тогда он будет ругаться на
ldconfig: Невозможно создать ссылку с /usr/lib//home/project/utils/new/lib/libtaxifuncs.so на libtaxifuncs.so
убрал $(TAXILIB) все равно ldconfig ругается и ищет в /usr/lib/lib
make clean делали?