Ссылка на библиотеку C, скомпилированную как C ++ - PullRequest
2 голосов
/ 15 июня 2010

Я сейчас в раю линкеров.У меня есть библиотека C, которая компилируется только в Visual C ++ (вероятно, она работает в gcc), если:

  1. Я компилирую ее как код C ++
  2. Определить __cplusplus, что приводит ко всемобъявления заключаются в extern "C" { }

Итак, для этого у меня есть статическая библиотека с именем, скажем, bsbs.lib

Теперь у меня есть проект C ++ с именем Testerкоторый хотел бы вызвать функцию barbar в объявленной в bsbs.h.Все идет хорошо, пока я не попытаюсь связать с bsbs.lib, где я получаю слишком знакомое:

Tester.obj : error LNK2001: unresolved external symbol _foofoo

И это всегда кажется foofoo, который не может быть решен независимо от того, какую функцию япозвоните в Tester (barbar или что-нибудь еще).

Обновление: Я расширил пункт 2 в соответствии с просьбой.Большое спасибо за помощь, ребята!

#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 */

Это, так сказать, "основной" заголовочный файл.Все важные функции здесь.Но есть и другие заголовочные файлы, вызываемые файлом bsbs.c, которые не заключены в extern "C" {}.

Решено: ОК, это довольно странно, ноЯ удалил бит extern C из заголовочного файла в bsbs, скомпилировал его как проект C ++ (хотя все файлы .c и удалил определение __cplusplus), и это сработало!Я получил идею после просмотра списка символов.Все было искажено , за исключением , которые были заключены в extern C (до), и он просил разбитый символ, поэтому я подумал, что что-то не так.

Ответы [ 5 ]

2 голосов
/ 15 июня 2010

Если вы объявите их как extern C в lib (что не нужно, если вы вызываете их из C ++), то они должны быть extern C в ваших заголовках.

2 голосов
/ 15 июня 2010

В библиотеке c может быть зависимость, которую вы не включили в свою ссылку.Включает ли библиотека c действительно ссылку на DLL?Если так, то есть программа под названием «зависит», которая скажет вам, каковы другие необходимые DLL.

0 голосов
/ 15 июня 2010

Импортирует ли ваш lib-файл какие-либо другие lib-файлы? Вы можете скомпилировать файл lib либо в файлы ссылок Explicity, либо неявно. Одним способом вы получаете файлы lib в виде огромного шара, а другой - как отдельные библиотеки, которые все должны быть связаны во время компиляции в финальном приложении. Если foofoo импортирован в ваш lib-файл из другого lib-файла, включите этот lib-файл в ваш окончательный проект. Это мое лучшее предположение из того, что вы описали, и, безусловно, это самая распространенная вещь, которую мне задают, когда я имею дело с файлами lib через коллег ..

0 голосов
/ 15 июня 2010

Может быть, комбинация компилятор / компоновщик должна знать, какие API нужно экспортировать / импортировать?В таком случае я бы попытался добавить соответствующие __declspec (например, dllimport и / или dllexport) в библиотеку C ++.

0 голосов
/ 15 июня 2010

Я предполагаю, что вы добавили ссылку на компоновщик.Например:

#pragma comment(lib, "bsbs.lib")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...