crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Статическая C библиотека в С++, Реально?
AD
  опции профиля:
сообщение 21.3.2014, 19:51
Сообщение #11


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

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

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




Репутация:   17  


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

А как это проверить, подскажешь? Mangle - искажаться... от этого слова слово манглятся????
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.3.2014, 10:48
Сообщение #12


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

Группа: Модератор
Сообщений: 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". иначе С++ компилятор это компилит по своим правилам и ищет не те функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.3.2014, 20:42
Сообщение #13


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

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

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




Репутация:   17  


Цитата(Iron Bug @ 22.3.2014, 11:48) *
так вот, если ты это собираешь разными (C и C++) компияторами, то никакого ifdef там быть не должно. просто extern "C". иначе С++ компилятор это компилит по своим правилам и ищет не те функции.

Ну это вообще не компилябельно стало. Ошибки компиляции жуткие...


Короче, вопрос решился. То ли я забыл при пересборке библиотеки помимо самих библиотек в саму тестовую программку подсунуть новый хедерник, то ли еще что-то... но после полной пересборки и замены - все заработало. Т.е. для полного счастья строчек:
#ifdef __cplusplus
  extern "C" {
#endif
и в конце закрывающая скобка в заголовочном файле библиотеки вполне хватает! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 27.3.2014, 21:41
Сообщение #14


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

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

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




Репутация:   12  


ну вот! о чём я, собственно, и говорила в самом начале темы. магии-то никакой нет :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.4.2024, 19:48