[VC++] Undefined references naar stdlib symbols vanuit lib

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ik probeer statisch te linken met ffmpeg in Visual C++ 2015 (Community Edition). Ik heb de libs zelf gebouwd (na een hoop gezeik met msys 8)7).

Wat heel gek is, en ik nog nooit eerder heb gezien, is dat de linker klaagt over unresolved external symbols naar standaard C functies vanuit de libs. Bijvoorbeeld:
1>libavcodec.a(ratecontrol.o) : error LNK2001: unresolved external symbol _sscanf

(let niet op de file extensies, ze zijn weldegelijk gebouwd met VC++)

Dat is raar, want _sscanf zit gewoon in LIBCMT.LIB, waar je standaard mee linkt in release builds met static stdlibs. Het vreemde is, als ik sscanf() zelf aanroep vanuit een source file in mijn project, dan verdwijnt de unresolved external symbol error. Het lijkt dus net alsof de linker vindt dat hij de symbols niet uit een andere library mag halen, terwijl dat volgens mij toch echt redelijk standaard behaviour is in MSVC++ (ik weet dat in GCC de volgorde van libraries zoals je ze meegeeft belangrijk is (geweest?), maar daar heeft MSVC++ nooit last van gehad).

Iemand enig idee hoe ik duidelijk kan maken dat ie ze gewoon uit de standaard libraries moet halen :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Heb je de libs van ffmpeg ook met Visual C++ 2015 gebuild (v140)? Deze fout kreeg ik volgens mij toen ik een VS2013 lib probeerde te linken met VS2015.

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ja, beide vanuit 2015 :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-10 23:30
Kan het een 32 vs 64 bit ding zijn?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
ik heb altijd gezeur van deze orde wanneer ik de std libs static link. Deze problemen verdwijnen meestal als ik de lib dynamisch tegen de std libs aan link. Ik geef het dan meestal op omdat het oplossen van dit type problemen meer tijd/frustratie kost dan dat ik zin heb om er aan te besteden.

ps: ik vind net een SO item, wat zegt dat dit een gevolg is van wijzingen in VS2015? Zou te maken hebben met gewijzigde definities in stdio.h oid waardoor de linker gaat zoeken naar symbols die er niet zijn. Geen tijd gehad om het te valideren: http://stackoverflow.com/...anf-in-visual-studio-2015

[ Voor 51% gewijzigd door Laurens-R op 09-10-2015 20:59 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Linken met legacy_stdio_definitions.lib fixt het idd! :)

Ik mis nu alleen nog deze:
1>libavutil.a(snprintf.o) : error LNK2001: unresolved external symbol __vacopy
1>libavutil.a(bprint.o) : error LNK2001: unresolved external symbol __vacopy


Dat lijkt me een configuratie-probleem. FFMPeg implementeert zijn eigen snprintf() en va_copy() (want MSVC++ had die niet voor 2013). Er is een va_copy.h waarin dit staat:

C++:
1
2
3
4
5
6
#if !defined(va_copy) && defined(_MSC_VER)
#define va_copy(dst, src) ((dst) = (src))
#endif
#if !defined(va_copy) && defined(__GNUC__) && __GNUC__ < 3
#define va_copy(dst, src) __va_copy(dst, src)
#endif


De eerste versie komt overeen met wat VC++ implementeert vanaf 2013. Maar blijkbaar vindt ie dus dat ie de GCC versie moet gebruiken. Weird.

.edit: nee wacht, daar staat nog een extra underscore in, dat kan het dus niet zijn.

[ Voor 5% gewijzigd door .oisyn op 09-10-2015 12:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1