2010-11-21 27 views
3

J'ai deux projets, l'un est une bibliothèque qui utilise les en-têtes libpq et l'exécutable, qui se connecte à ma bibliothèque et à libpq, mais peu importe comment je le mets dans le makefile, il ne lie pas la libpq et les allways me renvoient une erreur de référence indéfinie. Il lie ma lib ok. Les bibliothèques libpq.a et libmylib.a se trouvent à l'intérieur du répertoire Libs.
J'ai utilisé nm pour vérifier les fonctions et ils sont là, j'ai changé le -lpq en -lpq_ et le compilateur se plaint de la bibliothèque manquante, donc il trouve et théoriquement, liant, mais ne trouve pas les références?Référence non définie pour les fonctions libpq

ça m'embête vraiment, qu'est-ce que ça pourrait être?

(mon anglais est pas bon, désolé)

Merci,
Jonathan

Répondre

3

J'ai vérifié rapidement quelques-uns des en-têtes postgres je volent autour et ils semblent ne pas se draper dans extern "C" quand compilé avec un compilateur C++. Pourrait-il être possible que votre problème soit résolu en incluant les instructions include pour les en-têtes de postgre dans un bloc extern "C" { ... }?

Modifier. Je pense que le problème est le suivant: libpq.a and libmylib.a. J'ai d'abord oublié cela dans votre message original, désolé pour le bruit. Lorsque vous donnez -lpq à gcc, il essaie de lier dynamiquement. Sauf si vous donnez un répertoire de bibliothèque avec -L et il existe seulement des versions statiques des bibliothèques. Les bibliothèques statiques ne peuvent pas documenter les autres bibliothèques dont elles ont besoin. En outre, avec les bibliothèques statiques, l'ordre des spécifications est important. Les bibliothèques qui dépendent d'autres bibliothèques doivent être répertoriées avant elles. En installant via apt-get, vous avez installé des bibliothèques partagées qui documentent correctement ce qu'elles doivent chaîner (cochez ldd /usr/lib/libpq.so). Ainsi, dans votre tentative précédente, vous avez probablement juste besoin d'inverser -lpq avec -lMYLIB et de lister les autres bibliothèques dont libpq a besoin.

+0

J'ai ajouté extern "C" {#include "libpq-fe.h"} et n'a pas fonctionné – Jonathan

+0

AFAIK, ordre de liaison n'a pas d'importance avec les bibliothèques dynamiques, mais au cas où vous n'avez pas encore essayé, vous pourriez inverser '-lpq' et' -lMYLIB'. – dennycrane

+0

Je l'ai fait, alors ça me donne beaucoup plus d'erreurs, mais pour d'autres choses à l'intérieur de la libpq, comme kerberus et ça me dérangeait. Mais maintenant ça marche ... ce que j'ai fait a été de supprimer mon répertoire Libs que j'ai créé à des fins de liaison, puis j'ai installé libpq via apt-get et laissé le lien g ++ avec cette nouvelle lib, ça ne me donnait plus d'erreurs . Je suppose que c'est lié à d'autres bibliothèques aussi? C'est un peu une nouvelle pour moi. Si quelqu'un est nu pour expliquer ... – Jonathan