crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

AD
  опции профиля:
сообщение 13.3.2014, 21:34
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Можно ли использовать статическую библиотеку, написанную на C, в проекте на С++? Сделал эксперимент: пересобрал библиотеку компилятором С++, подсунул в проект - ошибок линковки не выдает, а когда сую С библиотеку - ошибки линкования. Можно ли так делать? Если можно, то как именно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Влад
  опции профиля:
сообщение 21.3.2014, 16:36
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Тогда проверяй, как манглятся имена экспортируемых/импортируемых функций. Мне доводилось сталкиваться с тем, что C-компилятор вставлял имя name, в то время как C++-компилятор вставлял (и, естессно, искал при импорте) для той же самой функции имя _name.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.3.2014, 10:48
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Влад @ 21.3.2014, 19:36) *
Мне доводилось сталкиваться с тем, что C-компилятор вставлял имя name, в то время как C++-компилятор вставлял (и, естессно, искал при импорте) для той же самой функции имя _name.

обычно такое бывает только в венде, при сборке разными компиляторами. например, при попытках скрестить MinGW и MSVC.
для таких проблем существуют специальные утилиты, которые выкусывают это подчёркивание из библиотек. сейчас уже не помню, как называются, ибо давно уже не работаю с вендой.
ещё такая проблема возникает в MSVC, если битности библиотек не совпадают. подчёркивание - это 32-битный MSVC. 64-битные библиотеки не имеют подчёркивания в экспорте.

если же всё собирать одним компилятором и с одинаковой битностью, то проблем возникать не должно.
под никсами я с таким не сталкивалась, там все более-менее современные компиляторы совместимы по генерируемым именам функций.

возможно, С-библиотека импортирует какие-то функции. тогда они тоже должны вызываться с порядком передачи параметров типа "C". то есть, надо extern "C" ставить на всё, что она импортирует.


посмотрела внимательно код библиотеки.
там стоит
#ifdef __cplusplus
  extern "C" {
#endif

так вот, если ты это собираешь разными (C и C++) компияторами, то никакого ifdef там быть не должно. просто extern "C". иначе С++ компилятор это компилит по своим правилам и ищет не те функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.6.2025, 6:16