Nefunkcni py-lxml

Miroslav Prýmek m.prymek at gmail.com
Mon Sep 21 20:27:41 CEST 2009



On 21.9.2009, at 17:47, Dan Lukes wrote:

> On 21.9.2009 16:23, Miroslav Prýmek:
>> --> Vsiml jsem si, ze portupgrade vypisuje "Backing up the old  
>> version",
>> ale nejak netusim, kde ji najit...
>
> Nikde, pokud sis neobjednal, aby se porizena zaloha zachovala. bez  
> toho existuje pouze po dobu update, kvuli tomu, aby bylo mozen se  
> pri neuspesen instalaci nove verze vratit ke stare. Po uspesne  
> instalaci je zaloha zrusena.
>

Ok, uz jsem objevil opsnu -b - a kam se ten balik nahraje? Normalne  
do /usr/ports/packages/...?

>
>> --> Jedinej anoncvs server, ke kterymu se mi podarilo pripojit, byl
>> anoncvs.tw.FreeBSD.org, coz neni
>> Jakej teda pouzit priste nejblizsi server?
>
> Jmena v tomhle formatu mi nic nerikaji (coz neznamena, ze nekde v  
> nejakem navodu nejsou takhle uvedena). Ja pouzivam cvsup.ZEME.freebsd.org 
>  kde ZEME=cs
>

Je to treba tady: http://www.freebsd.org/doc/en/books/handbook/anoncvs.html
Nejak jsem si nevimproc myslel, ze v tom cvsup je neco jinyho nez v  
anoncvs...

>> Me porad nejde do hlavy, jak muze PO KOMPILACI byt nejakej  
>> nedefinovanej
>> symbol. Vzdyt to by ta kompilace mela
>> zhavarovat, ne?
>
> Aha. Ty nevis, co je kompilace. Nebo, prinejmensim, nerozlisujes  
> kompilaci (preklad) a linkovani (sestaveni).
> [...]
>
>> mi to nejak polopaticky priblizit
>
> Nekteri si mysli, ze prave tohle mi jde. Tak snad se to podarilo ...

Musim se pridat k nazoru, ze ti to fakt jde ;) - a dekuju za obsahly  
vyklad.

Nicmene v tomhle jsme si nerozumeli - kdyz jsem psal "po kompilaci",  
tak jsem tim myslel "kompilaci balicku"
- kompilaci, linkovani, ...., instalaci. Takze spravne otazka mela  
znit "jaktoze se balicek bez problemu prelozi
a nainstaluje, kdyz mu chybi nejaky symbol v knihovne, kterou pouziva"  
- a odpoved, ktera me napadla: protoze vysledkem, kterej
se instaluje neni spustitelna binarka, ale zase knihovna, u ktere to  
proste "nevadi" (resp. nevadi to nikomu
krome uzivatele ;)

Jal jsem se to zkusit:
----------------------------------------- mylib.h
void myLibFunc();
----------------------------------------- mylib.c
#include <stdio.h>
#include "mylib.h"

void myLibFunc() {
   printf("Hola hola hola!\n");
}
----------------------------------------- myapp.c
#include "mylib.h"

int main() {
   myLibFunc();
}
----------------------------------------- Makefile
.PHONY: clean all

all: libmylib.so myapp

clean:
	rm *.o *.so myapp 2>/dev/null || true	


libmylib.so: mylib.c mylib.h
	gcc -c mylib.c -o mylib.o
	gcc -shared mylib.o -o libmylib.so
	rm mylib.o # ciste proto, aby se mi tam nemotal

myapp: myapp.c mylib.h libmylib.so
	gcc -c myapp.c -o myapp.o
	gcc -L. -lmylib myapp.o -o myapp

-----------------------------------------
Kdyz ted vytvorim binarku, je vsechno v poradku:
# make all
gcc -c mylib.c -o mylib.o
gcc -shared mylib.o -o libmylib.so
rm mylib.o
gcc -c myapp.c -o myapp.o
gcc -L. -lmylib myapp.o -o myapp
# setenv LD_LIBRARY_PATH .
# ldd myapp
myapp:
	libmylib.so => ./libmylib.so (0x2807d000)
	libc.so.7 => /lib/libc.so.7 (0x2807f000)
# ./myapp
Hola hola hola!

Kdyz v mylib.c zmenim myLibFunc na myLibFuncX, tak to zhavaruje (coz  
jsem prave cekal i u toho py-lxml):
#  
make 
                                                                                                              [ret 
: 0] [mprymek at kyrios.gosw.cz]
gcc -c mylib.c -o mylib.o
gcc -shared mylib.o -o libmylib.so
rm mylib.o
gcc -c myapp.c -o myapp.o
gcc -L. -lmylib myapp.o -o myapp
myapp.o(.text+0x12): In function `main':
: undefined reference to `myLibFunc'
*** Error code 1

No a me slo o to, ze nevim, jak vnitrne to linkovani presne funguje -  
predpokladam,
ze .so objekt ma v sobe nejaky zaznam "potrebuju objekty libprvni.so.1  
a libdruha.so.2"
a pak ma seznam nedefinovanych symbolu, kterej se ale resi az tehdy,  
kdy se symbol skutecne
pouzije nebo co...

Pomoci ldd potom muzu zjistit, jestli jsou k dispozici vsechny tyhle  
objekty, ale nezjistim, jestli
jsou k dispozici skutecne vsechny symboly, ktery jsou nedefinovany...

# ldd libmylib.so
libmylib.so:
	libc.so.7 => /lib/libc.so.7 (0x28080000)

Jestli to dobre chapu, tak problem je v tom, ze jde udelat:
# gcc -shared myapp.o -o libmyapp.so
prestoze je tam ten nedefinovanej symbol myLibFunc (v knihovne je  
myLibFuncX)

Porad nerozumim tomu, proc je mozny vytvorit knihovnu, ktera ma nejaky  
nedefinovany
symboly, ktery nejsou v dobe jejiho prekladu k dispozici v zadne z  
knihoven, ktery linkuje
- myslel jsem, ze se to hlida, a ze kdyz ldd ma vsechno "zaplneny",  
tak nemuze
byt zadnej nedefinovanej symbol, coz jsem se teda spletl - v tom je  
ten zakopanej pes...

Ale mozna to chapu nejak uplne blbe :)

M.


More information about the Users-l mailing list