2010-06-14 14 views
2

Je suis dans le paradis des liens maintenant. J'ai une bibliothèque C qui compile uniquement en Visual C++ (cela fonctionne probablement gcc) si:Liaison à une bibliothèque C compilée en C++

  1. Je compile comme C++ Code
  2. Définir __cplusplus qui se traduit par toutes les déclarations étant enfermé dans extern "C" { }

Alors, en faisant cela j'ai une bibliothèque statique appelée, par exemple, bsbs.lib

maintenant, j'ai un projet C++ appelé Tester qui voudrait appeler la fonction barbar dans déclaré dans bsbs.h. Tout va bien, jusqu'à ce que je tente de créer un lien vers bsbs.lib où je reçois le tout aussi familier:

Tester.obj : error LNK2001: unresolved external symbol _foofoo 

Et il semble toujours être foofoo qui ne peut être résolu quelle que soit la fonction que j'appelle à Tester (barbar ou rien d'autre).

Mise à jour: J'ai développé le point 2 comme demandé. Merci beaucoup pour l'aide les gars!

#ifndef _BSBS_H 
#define _BSBS_H 

/* Prevent C++ programs from name mangling these definitions. */ 
#ifdef __cplusplus 
extern "C" { 
#endif 

#include <stdio.h> 
#include <setjmp.h> 
....... 
....... 
#ifdef __cplusplus 
} 
#endif 

#endif /* _BSBS_H */ 

Ceci est le fichier d'en-tête "principal", pour ainsi dire. Toutes les fonctions importantes sont ici. Mais il existe d'autres fichiers d'en-tête appelés par le fichier bsbs.c qui sont et non inclus dans extern "C" {}.

Résolu: OK, cela est assez bizarre, mais je retire le bit extern C du fichier d'en-tête dans bsbs, compilé comme un projet C++ (même si tous les fichiers sont .c et retirés de la __cplusplus définir) et ça a marché! J'ai eu l'idée après avoir regardé la liste des symboles. Tout a été mutilé sauf ceux inclus dans extern C (doh) et il demandait un symbole démêlé donc j'ai pensé que quelque chose n'allait pas.

+1

Et vous ne référencez pas "_foofoo" n'importe où dans le code du testeur? –

+0

Que voulez-vous dire au point 2 - Je pense que nous devons voir du code car cela pourrait être faux – Mark

+1

Est-ce que 'foofoo' dans une troisième bibliothèque vous manque, par exemple' bsbs.lib' a besoin d'autre chose, par hasard? –

Répondre

2

Si vous les déclarez comme extern C dans la bibliothèque lib (ce qui est inutile, si vous les appelez depuis C++), ils doivent être extern C dans vos en-têtes.

+0

Mais pas dans les en-têtes de 'Tester' qui est C++, non? – Jacob

+0

Si elles sont extern C, elles sont extern C. Vous ne pouvez pas mélanger et faire correspondre. Si la lib les exporte en tant que extern C, alors vous devez les importer en tant que extern C. – Puppy

0

Je suppose que vous avez ajouté une référence d'éditeur de liens. E.g .:

#pragma comment(lib, "bsbs.lib") 
+0

Eh bien, j'ai défini les bibliothèques d'entrée ailleurs donc il lit 'bsbs.lib' – Jacob

2

Il peut y avoir une dépendance dans la bibliothèque c que vous n'incluez pas dans votre lien. Est-ce que la bibliothèque c que vous incluez vraiment une référence à une DLL? Si oui, il y a un programme appelé 'depends' qui vous dira quelles sont les autres DLL requises.

+0

Je ne pense pas puisque' foofoo' est défini dans 'bsbs.lib' et il semble être indépendant. – Jacob

0

Peut-être que la combinaison compilateur/éditeur de liens doit être mise au courant des API à exporter/importer? Si oui, j'essaierais d'ajouter le __declspec approprié (par exemple, dllimport et/ou dllexport) à la bibliothèque C++.

0

Votre fichier lib importe-t-il d'autres fichiers lib? Vous pouvez compiler un fichier lib vers des fichiers lib de liens explicites ou implicitement. D'une façon, vous obtenez les fichiers lib dans une énorme boule, l'autre vous les obtenez en tant que bibliothèques séparées qui ont toutes besoin d'être liées au moment de la compilation dans l'application finale.Si foofoo est importé dans votre fichier lib depuis un autre fichier lib, incluez ce fichier lib dans votre projet final. Ceci est ma meilleure estimation de ce que vous avez décrit, et est de loin la chose la plus commune que je reçois lorsqu'on traite des fichiers lib par des collègues.

+0

Je ne pense pas que ce soit le cas puisque 'foofoo' semble être complètement défini. – Jacob