Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C] linconflate: undefined reference to `init_alarmqueue'

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik krijg vreemde linker errors bij het testen van libconflate. Ik heb de laatste versie van git gedownload (https://github.com/membase/libconflate). Om voor mij onverklaarbare krijg ik undefined references naar functies die naar mijn inzien toch écht moeten bestaan.

Eén van de errors:
code:
1
2
3
$ libtool: link: gcc -std=gnu99 -o .libs/check_alarm check_alarm-check_alarm.o  ../.libs/libconflate.so -lcheck_pic -pthread
check_alarm-check_alarm.o: In function `handle_setup':
/home/martijn/libconflate/tests/check_alarm.c:14: undefined reference to `init_alarmqueue'


Wanneer ik een objdump doe van het geïnclude libconflate.so bestand en zoek naar init_alarmqueue, dan staat deze er gewoon in:

code:
1
2
$ objdump -t ../.libs/libconflate.so | grep init_alarmqueue
0000000000001990 l     F .text  000000000000003c              init_alarmqueue


Als ik de compile bekijk, zie ik dat libconfig.so wordt opgebouwd uit een aantal .o bestanden:

code:
1
libtool: link: gcc -shared  -fPIC -DPIC  .libs/adhoc_commands.o .libs/alarm.o .libs/conflate.o .libs/kvpair.o .libs/logging.o .libs/persist.o .libs/rest.o .libs/util.o .libs/xmpp.o   /usr/lib/x86_64-linux-gnu/libcurl-gnutls.so  -pthread -O3   -pthread -Wl,-soname -Wl,libconflate.so.0 -o .libs/libconflate.so.0.0.0


Wanneer ik i.p.v. libconflate.so alarm.o gebruik bij het compileren dan werkt het wel goed. Om de een of andere reden lukt het ld dus niet om het juiste symbool te vinden. Ik kan hier nergens een oplossing voor vinden.

Ik ontken het bestaan van IE.


  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Waarom gebruik je -o en niet lconflate om te linken met libconflate.so?

[code]
gcc -o my_application my_application.o -lmylib
[/code]


edit: aha, wist niet dat de command line zo ook valid was.

[ Voor 19% gewijzigd door EddoH op 05-09-2012 17:19 ]


  • Soultaker
  • Registratie: September 2000
  • Nu online
De command lines kloppen wel, maar de l in de objdump output vertelt dat init_alarmqueue een local symbol is. Waarschijnlijk is dat dus een interne functie die je niet geacht wordt in je applicatie (direct) aan te roepen.

(Meestal worden dat soort functies ook niet in de publieke header files gedeclareerd, zodat het bij het compileren al misgaat, en niet pas bij het linken.)

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Welke / bedoel je precies in de objdump? Ik zie nergens een / staan op de de output regel.

Wat ik nog vergeten was te vermelden is dat deze fout wordt gegenereerd door de 'make test' van libconflate zelf.

De functies staan gewoon in de header file, en het feit dat er een testscript is om te kijken of deze kunnen worden aangeroepen lijkt er ook op te wijzen dat ze gewoon van buiten zouden moeten kunnen worden aangeroepen.

Ik ontken het bestaan van IE.


  • Soultaker
  • Registratie: September 2000
  • Nu online
cyberstalker schreef op woensdag 05 september 2012 @ 19:35:
Welke / bedoel je precies in de objdump? Ik zie nergens een / staan op de de output regel.
Deze kleine letter l hier (die op een 1 lijkt in sommige lettertypes):
                 v
0000000000001990 [b]l[/]     F .text  000000000000003c              init_alarmqueue
                 ^
De functies staan gewoon in de header file, en het feit dat er een testscript is om te kijken of deze kunnen worden aangeroepen lijkt er ook op te wijzen dat ze gewoon van buiten zouden moeten kunnen worden aangeroepen.
Dan denk ik dat de developers van libconflate n00bs zijn, want zo te zien worden alleen de functies in conflate.h geëxporteert (doe maar eens grep EXPORT -A1 *.h). Het is logisch dat je dan dit soort problemen krijgt.
Wat ik nog vergeten was te vermelden is dat deze fout wordt gegenereerd door de 'make test' van libconflate zelf.
Om die tests te runnen kun je de boel eens re-configureren met:
./configure CFLAGS=-fvisibility=default

... dan werkt het vast wel. Maar als dat nodig is om de tests te runnen, lijkt me dat toch echt een probleem met het build system van libconflate en niet een probleem aan jouw kant.