![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
AD |
![]()
Сообщение
#1
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Можно ли использовать статическую библиотеку, написанную на C, в проекте на С++? Сделал эксперимент: пересобрал библиотеку компилятором С++, подсунул в проект - ошибок линковки не выдает, а когда сую С библиотеку - ошибки линкования. Можно ли так делать? Если можно, то как именно?
|
|
|
![]() |
AD |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Тогда проверяй, как манглятся имена экспортируемых/импортируемых функций. Мне доводилось сталкиваться с тем, что C-компилятор вставлял имя name, в то время как C++-компилятор вставлял (и, естессно, искал при импорте) для той же самой функции имя _name. А как это проверить, подскажешь? Mangle - искажаться... от этого слова слово манглятся???? |
|
|
Iron Bug |
![]()
Сообщение
#12
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Мне доводилось сталкиваться с тем, что C-компилятор вставлял имя name, в то время как C++-компилятор вставлял (и, естессно, искал при импорте) для той же самой функции имя _name. обычно такое бывает только в венде, при сборке разными компиляторами. например, при попытках скрестить MinGW и MSVC. для таких проблем существуют специальные утилиты, которые выкусывают это подчёркивание из библиотек. сейчас уже не помню, как называются, ибо давно уже не работаю с вендой. ещё такая проблема возникает в MSVC, если битности библиотек не совпадают. подчёркивание - это 32-битный MSVC. 64-битные библиотеки не имеют подчёркивания в экспорте. если же всё собирать одним компилятором и с одинаковой битностью, то проблем возникать не должно. под никсами я с таким не сталкивалась, там все более-менее современные компиляторы совместимы по генерируемым именам функций. возможно, С-библиотека импортирует какие-то функции. тогда они тоже должны вызываться с порядком передачи параметров типа "C". то есть, надо extern "C" ставить на всё, что она импортирует. посмотрела внимательно код библиотеки. там стоит
так вот, если ты это собираешь разными (C и C++) компияторами, то никакого ifdef там быть не должно. просто extern "C". иначе С++ компилятор это компилит по своим правилам и ищет не те функции. |
|
|
AD |
![]()
Сообщение
#13
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
так вот, если ты это собираешь разными (C и C++) компияторами, то никакого ifdef там быть не должно. просто extern "C". иначе С++ компилятор это компилит по своим правилам и ищет не те функции. Ну это вообще не компилябельно стало. Ошибки компиляции жуткие... Короче, вопрос решился. То ли я забыл при пересборке библиотеки помимо самих библиотек в саму тестовую программку подсунуть новый хедерник, то ли еще что-то... но после полной пересборки и замены - все заработало. Т.е. для полного счастья строчек: и в конце закрывающая скобка в заголовочном файле библиотеки вполне хватает! ![]() |
|
|
Iron Bug |
![]()
Сообщение
#14
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
ну вот! о чём я, собственно, и говорила в самом начале темы. магии-то никакой нет
![]() |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 26.5.2025, 4:26 |