Question

Je n'ai pas d'expérience significative avec C ++ mais récemment dû participer au projet avec une partie de C (modules apache, en fait).

En ce moment je suis juste essayer de construire un code existant héritage beaucoup et faire face au problème très bizarre quand VC ++ linker ne peut pas trouver une fonction particulière dans la bibliothèque apache (en voyant le reste d'entre eux) .

Le code est comme celui-ci (comme pris de l'échantillon trivial construit spécifiquement pour lutter contre ce problème):

ap_rputs(ap_gm_timestr_822(r->pool, time(NULL)), r);

(cela devrait simplement imprimer la date actuelle, mais il n'a pas vraiment beaucoup d'importance)

Et l'erreur que je reçois est comme ceci:

error LNK2019: unresolved external symbol _ap_gm_timestr_822@12 referenced in function _hello_handler

Maintenant, la partie étrange: cette fonction existe réellement dans la bibliothèque, je suis la liaison avec, mais son nom de symbole, il est _ap_gm_timestr_822 @ 8 (pas @ 12 , mais @ 8 à la fin).

J'ai essayé de jouer avec presque tous les biens possibles compilateur / éditeur de liens dans MSVC ++ -. Sans effet, malheureusement

Serait-ce problème est lié au fait que la bibliothèque (qui fait partie de la distribution apache 1.3) est construit avec un autre / ancien / ... compilateur que j'utilise? Je suis actuellement en utilisant MS VC ++ express 2008. Si tel est le cas, quelqu'un a une idée de ce qui peut être fait pour contourner ce problème?

Était-ce utile?

La solution

Le typedef time_t se décline en deux saveurs, l'héritage 32 bits qui va créer le problème de Y2K38 et 64 bits, la solution à ce problème. Vous avez un décalage ici.

Vérifiez le fichier d'en-tête de time.h du tube cathodique que vous utilisez, il devrait y avoir un #ifdef en ce qui sélectionne entre l'héritage et la version 64 bits. Évitez d'utiliser l'héritage si vous attendez encore d'être un programmeur 2038.

Autres conseils

Dans Visual Studio, le suffixe @ indique la taille totale des octets des arguments. Le fait qu'il diffère entre les deux fonctions: une non-concordance de la signature. Très probablement, compte tenu de la différence de taille, vous essayez de lien vers la fonction de 32 bits 64 bits.

Ces noms de composent sont les noms de la fonction combinée avec des détails du type d'arguments.

Ainsi, le fichier d'en-tête vous compris la fonction déclarée avec des arguments qui ne correspond pas à la lib vous créez un lien avec.

J'ai frappé ce le plus souvent lorsqu'un « -define » est erroné sur la ligne de commande du compilateur, afin de choisir une option dans le fichier d'en-tête qui ne correspond pas à la lib vous créez un lien avec. Souvent, cela est à choisir le « threading » que vous voulez, ou si vous voulez Unicode.

Alors vérifiez si vous ligne de commande compilateur correctement concordante éditeur de liens ligne de commande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top