LINUX.ORG.RU

Проблемы со статической линковкой


0

0

Необходимо с помощью библиотек для Suse зделать работающюю в Slackware программу.

При простой (динамической} сборке в Slackware ничего не работает. Есть идея собрать статически все в Suse и запустьть бинарник в Slackware и тут беда: Пишу

apollo# make

g++ -g -D_UNIX_ -D_LINUX_ -D_DEBUG -I/usr/local/iPORT//Includes -c expcontrol.cpp -o expcontrol.o

g++ -L/usr/local/iPORT/Libraries -static \ /usr/local/iPORT/Libraries/libCyCam.so /usr/local/iPORT/Libraries/libCyCom.so /usr/local/iPORT/Libraries/libCyImg.so /usr/local/iPORT/Libraries/libCyUtils.so /usr/lib/libSDL.so\ /usr/lib/libpthread.so /usr/lib/libdl.so /usr/lib/libc.so\ expcontrol.o -I./FpgaRegs -o all.bin\

apollo # ./all.bin bash:

./all.bin: No such file or directory

apollo # ls -la | grep all.bin

-rwxr-xr-x 1 root root 841420 Jul 15 15:55 all.bin

apollo # file ./all.bin

./all.bin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped

apollo:# ldd all.bin

/usr/bin/ldd: line 1: ./all.bin: No such file or directory

Ничего понять не могу как так может быть? Подскажите можнт быть я ошибся где?


для статитической линковки нужны статические версии библиотек :) те самые которые *.a

строчка которую ты дал линкеру практически означает следующее : собирать приложение по возможности статически, но вот с этими динамическими либами.

ps: лучше разобраться почему при динамической сборке ничего не заработало.

anonymous
()

> apollo:# ldd all.bin

>/usr/bin/ldd: line 1: ./all.bin: No such file or directory

>Ничего понять не могу как так может быть? Подскажите можнт быть я ошибся где?

Попробуй ldd -v, но наверняка динамический линковщик не находит libCyCam.so и компанию - они у тебя слинкованы динамически.

Я бы на твоем месте сделал ровно наоборот - убрал бы -static (чтобы линковка с libc была всё же динамической) и статически слинковал libCy*. Для этого, как уже сказал тебе анонимный брат, у тебя должны быть статические библиотеки (libCy*.a).

> -I./FpgaRegs

ПЛИСами занимаешься?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Попробовал с .a ! выдает ошибки на все библиотеные вызов: undefined reference to bla-bla

А пишу я обвязку для ПЗС-камеры

ibm
() автор топика
Ответ на: комментарий от tailgunner

С *.a вообще не собирается. Ошибки выдает g++. Ругается на libCy* libCy*.a есть/ К сожалению исходиков для них нет/

ibm
() автор топика
Ответ на: комментарий от ibm

Жаль, ты не сказал, как именно оно ругается. Но скорее всего, у тебя командная строка, задающая сборку, неправильная. Ты, наверное, просто заменил libCy*.so на libCy*.a ? Запости команду и вывод g++ - может, поймем, в чем дело. Я и сам вечно путаюсь с вариантами задани либ - где надо писать -lc, а где /usr/lib/libc.a

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

g++ -g -D_UNIX_ -D_LINUX_ -D_DEBUG -I/usr/local/iPORT//Includes -c expcontrol.cpp -o expcontrol.o

g++ /usr/local/iPORT/Libraries/libCyCam.a /usr/local/iPORT/Libraries/libCyCom.a /usr/local/iPORT/Libraries/libCyImg.a /usr/local/iPORT/Libraries/libCyUtils.a /usr/lib/libSDL.a\ /usr/lib/libpthread.a /usr/lib/libdl.a /usr/lib/libc.a\ expcontrol.o -I./FpgaRegs -o all.bin\ -L/usr/local/iPORT/Libraries

expcontrol.o(.text+0x966): In function `sendcom1(char*, char**)': /usr/local/iPORT/Samples/SampleApplication/iPORT2/expcontrol.cpp:253:

undefined reference to `CyDevice::SendCommand(CyDevice::Port, void const*, unsigned, unsigned long)'

expcontrol.o(.text+0x97b):/usr/local/iPORT/Samples/SampleApplication/iPORT2/expc ontrol.cpp:254: undefined reference to `CyDevice::GetAnswerQueueSize(CyDevice::Port)'

expcontrol.o(.text+0x9c9):/usr/local/iPORT/Samples/SampleApplication/iPORT2/expc ontrol.cpp:260: undefined reference to `CyDevice::ReceiveAnswer(CyDevice::Port, void*, unsigned*, unsigned long)'

expcontrol.o(.text+0xe9c): In function `main': /usr/local/iPORT/Samples/SampleApplication/iPORT2/expcontrol.cpp:381: undefined reference to `CyXMLDocument::CyXMLDocument[in-charge](std::basic_string<char, std::char_traits<char>, std:: allocator<char> > const&)'

expcontrol.o(.text+0xf2e):/usr/local/iPORT/Samples/SampleApplication/iPORT2/expc ontrol.cpp:382: undefined reference to `CyXMLDocument::LoadDocument()'

expcontrol.o(.text+0xf54):/usr/local/iPORT/Samples/SampleApplication/iPORT2/expc ontrol.cpp:384: undefined reference to `CyXMLDocument::~CyXMLDocument [in-charge]()'

expcontrol.o(.text+0xf8a):/usr/local/iPORT/Samples/SampleApplication/iPORT2/expc ontrol.cpp:388: undefined reference to `CyConfig::LoadFromXML(CyXMLDocument&)'

И далее в том же духе! Заранее спасибо за помощь!!!!!

ibm
() автор топика
Ответ на: комментарий от ibm

Картинка знакомая, только не помню, чем вызывается :(

Попробуй так - замени все /usr/local/iPORT/Libraries/lib на -l, чтобы получилось что-то вроде:

g++ expcontrol.o -o all.bin -L/usr/local/iPORT/Libraries -lCyCam -lCyCom ...

Заметь, что объектный файл идет первым, а -L идет до указания библиотек. Кстати, ты уверен, что тебе нужна libdl? А libpthread и libc лучше линковать динамически - они вполне стандартны даже между дистрибутивами. Опция -I в линковке не нужна.

Если сборка пройдет успешно, проверь ее результат ldd - все ли нужные тебе либы слинкованы статически. Если нет 0 запости результат.

tailgunner ★★★★★
()

просто про командную строку : а что у тебя там делает символ "\"; это эффект от разменесения по строкам ? тогда нафига он в конце командной строки...

anonymous
()
Ответ на: комментарий от anonymous

Не бойтесь я не в курсе про "\" Это пережитки копирования мышкой изкомандной строки + частое редактирование Makefile в поисках нужного варинта сборки

ibm
() автор топика
Ответ на: комментарий от tailgunner

apollo:/usr/local/iPORT/Samples/SampleApplication/iPORT2 # make g++ -g -D_UNIX_ -D_LINUX_ -D_DEBUG -I/usr/local/iPORT//Includes -c expcontrol.cpp -o expcontrol.o

g++ -L/usr/local/iPORT/Libraries -lCyUtils -lCyCom -lCyCam -lCyImg -ldl -lpthread -lc -lSDL expcontrol.o -o all.bin o serv.bin

apollo:/usr/local/iPORT/Samples/SampleApplication/iPORT2 # ldd ./all.bin

libCyUtils.so => /usr/local/iPORT/Libraries/libCyUtils.so (0x4002c000)

libCyCom.so => /usr/local/iPORT/Libraries/libCyCom.so (0x4005b000)

libCyCam.so => /usr/local/iPORT/Libraries/libCyCam.so (0x40177000)

libCyImg.so => /usr/local/iPORT/Libraries/libCyImg.so (0x4024b000)

libdl.so.2 => /lib/libdl.so.2 (0x403da000)

libpthread.so.0 => /lib/i686/libpthread.so.0 (0x403dd000)

libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0x4042e000)

libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40491000)

libm.so.6 => /lib/i686/libm.so.6 (0x40551000)

libc.so.6 => /lib/i686/libc.so.6 (0x40575000)

libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x406a8000)

libxerces-c.so.22 => /usr/local/iPORT/Libraries/libxerces-c.so.22 (0x406b0000)

librt.so.1 => /lib/librt.so.1 (0x40980000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

libartsc.so.0 => /opt/kde3/lib/libartsc.so.0 (0x40993000)

libesd.so.0 => /usr/lib/libesd.so.0 (0x40999000)

Тобишь все библиотеки слинкованы динамически. :(

ibm
() автор топика
Ответ на: комментарий от tailgunner

Так уже пробовал :( Опять ошибки

g++ -g -D_UNIX_ -D_LINUX_ -D_DEBUG -I/usr/local/iPORT//Includes -c expcontrol.cpp -o expcontrol.o

g++ -L/usr/local/iPORT/Libraries -lCyUtils -lCyCom -lCyCam -lCyImg -ldl -lpthread -lc -lSDL -static expcontrol.o -o all.bin expcontrol.o(.text+0x966): In function `sendcom1(char*, char**)': /usr/local/iPORT/Samples/SampleApplication/iPORT2/expcontrol.cpp:253: undefined reference to `CyDevice::SendCommand(CyDevice::Port, void const*, unsigned, unsigned long)'

expcontrol.o(.text+0x97b):/usr/local/iPORT/Samples/SampleApplication/iPORT2/expc ontrol.cpp:254: undefined reference to `CyDevice::GetAnswerQueueSize(CyDevice::Port)'

expcontrol.o(.text+0x9c9):/usr/local/iPORT/Samples/SampleApplication/iPORT2/expc ontrol.cpp:260: undefined reference to `CyDevice::ReceiveAnswer(CyDevice::Port, void*, unsigned*, unsigned long)'

и так далее на каждый libCy* вызов

ibm
() автор топика
Ответ на: комментарий от ibm

у вас есть статические версии Ваших (не систменых) библиотек ?
те которые libCyImg.a libCyCom.a etc ??

Makefile :
LD=g++
CXX=g++
CXXFLAGS=-g -Wall -Wextra
LDLIBS=-lpthread -ldl
CY=path_toCyLibs/
CYARCH=$(CY)libCyImg.a $(CY)libCyCom.a 
OBJS=expcontrol.o

all : serv.bin

serv.bin : $(OBJS) $(CYARCH)

expcontrol.o : expcontrol.cpp

короче, те либы которые не стандартны и которые Вы не собираетесь 
отдельно поставлять для целевой системы линкуются статически,
то есть линкеру подставляются архивы (*.a) всё прочее пусть остаётся как есть..

ps: в приведённом makefile могут быть ашипки :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от ibm

Библиотеки должны идти _после_ объектного файла, их использующего. Я смутно припоминаю, что даже порядок библиотек важен.

tailgunner ★★★★★
()
Ответ на: комментарий от MKuznetsov

CXX=g++

CXXFLAGS=-g -Wall -Wextra

LDLIBS=-lpthread -ldl -lxerces-c

CY=/usr/local/iPORT/Libraries/

CYARCH=$(CY)libCyImg.a $(CY)libCyCom.a $(CY)libCyUtils.a$(CY)libCyCam.a

OBJS=expcontrol.o

BIN=all.bin

all: all.bin

all.bin: expcontrol.o $(LD) $(LDLIBS) $(OBJS) $(CYARCH)

expcontrol.o:

$(CXX) $(CXXFLAGS) expcontrol.cpp

clean:

rm -rf $(OBJS) $(BIN)

#make g++ -lpthread -ldl -lxerces-c expcontrol.o /usr/local/iPORT/Libraries/libCyImg.a /usr/local/iPORT/Libraries/libCyCom.a /usr/local/iPORT/Libraries/libCyUtils.a /usr/local/iPORT/Libraries/libCyCam.a

/usr/local/iPORT/Libraries/libCyCom.a(Timeout.o)(.text+0x29d): In function `QuerySystemTime(long long*)':

: undefined reference to `clock_gettime'

/usr/local/iPORT/Libraries/libCyUtils.a(CyXMLDocument.o)(.text+0xaf): In function `CyXMLDocument::HasChildElements()':

: undefined reference to `xercesc_2_2::XMLString::transcode(unsigned short const*)'

/usr/local/iPORT/Libraries/libCyUtils.a(CyXMLDocument.o)(.text+0xd7): In function `CyXMLDocument::HasChildElements()':

: undefined reference to `xercesc_2_2::XMLString::release(char**) ....ets....

Sorry my russian keyboard is missing. Unfortunatly it is not work, but Errors is changing!!!!!

Errors in all libCy* funstions

ibm
() автор топика
Ответ на: комментарий от ibm

уже лучше :) осталось только поставить правильные либы :)

начнём с того, что clock_gettime скорее живёт в librt, и надо добавить -lrt в LDLIBS

то есть читаем доки и выесняем где живут означенные функции и методы; выяснив - включаем эти библиотеки так как считаем нужным

MKuznetsov ★★★★★
()
Ответ на: комментарий от ibm

Добавь -lrt - по-моему, clock_gettime определена там. И попробуй перенести -lxerces-c в CYARCH, чтобы она была после libCy*

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.