![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| AlterMann |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Здравствуйте, о многоуважаемые!
Довелось мне познакомиться не так давно с интересным таким языком D. Но естественно сам по себе D как-то не очень доставляет, поскольку много кода уже написано на C++ и хотелось бы поэтому научиться дружить их вместе. Раньше я этого, к сожалению не делал, с другими языками. Только на С++ писал библиотеку и использовал в другом С++ коде. Итак, естественно почитав интернетов, написал следующее на D:
Данный код компилирую так: dmd -release -O -lib -odlib -oflibautomata.a *.d Затем пытаюсь подключить полученную библиотеку к Qt проекту, предварительно написав на C++:
В Qt проект добавил библиотеку собранную на D. При сборке проекта получаю ошибку:
Что-то ошибка совсем уж такая знакомая знакомая, но понять не могу, что не так. Подскажите пожалуйста. |
||||||
|
|||||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
А собственно тело функции createAutomata в библиотеке присутствует?
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Guinness |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: нет Всего: 10 |
feodorv, там вроде реализованно:
А может быть косяк в том, что произошло вот это объявление в С++ коде:
И данная функция перекрывает библиотечную? |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Guinness, если у них сигнатуры совпадают, то перекрытия быть не должно. Вопрос только в том, а как у D вообще с экспортом? Потому что даже экспорты разных компиляторов С++ несовместимы.
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Cкорей всего несоответствие компиляторов.
В С++ есть такая весч как замангливание (mangled) имен функций. Так вот, соответствия в этом замангливании, нет даже в родном С++ коде от разных компиляторов. Что уж говорить об компиляторе D. Добавлено через 47 секунд упс. пост bsa, не видел |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Вроде да, а с каким именем попало в библиотеку - неизвестно))) Вот))) Надо залезть внутрь библиотеки, поискать строчку createAutomata, и понять, что компилятор сотворил с именем. Быть может, там только лишний префикс по сравнению с именем, генерируемом в C++. Это сообщение отредактировал(а) feodorv - 12.7.2013, 15:58 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| AlterMann |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
bsa, по идее, когда мы в D объявляем фукнцию как export(C++), компилятор кладёт в библиотеку функцию соответствующую правилам именования в С++. С другой стороны, куда уж там, если у каждого компилятора свои приколы могут быть в этом направлении. :(
feodorv, посмотрел библиотеку и нашёл там пару вбросов такого содержания:
Правда мне это ни о чём не говорит. Попробовал скомпилировать D код с помощью GDC (на основе GCC 4.8.1). Опции компиляции и сборка библиотеки:
Библиотека собралась ок. При попытке собрать C++ проект - та же проблема. Посмотрел внутрь полученной библиотеки и обнаружил такое же вхождение упоминания о не линкуемой функции:
Пробовал менять сигнатуру функции в D коде с
безрезультатно. Это сообщение отредактировал(а) AlterMann - 13.7.2013, 00:28 |
||||||||
|
|||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
AlterMann, сделай тоже самое на С++ и посмотри, как будет в нем называться.
|
|||
|
||||
| AlterMann |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Проблема сдвинулась с мёртвой точки.
Внимательно посмотрев сигнатуру функции в скомпиленной библиотеке, я обнаружил не соответствие типов, и size_t или ulong преобразовывалось в unsigned long long, что явно не то же самое, что unsigned long. Чтобы раз и на всегда избавиться от этого, определил и в С++ и в D метод createAutomata(unsigned int, unsigned int), и вуаля, линковка этой функции таки прошла успешно. Но появились новые неожиданности. Теперь, в случае сборки библиотеки с помощью dmd (или gdc) и дальнейшей попытки заюзать библиотеку в C++ коде я получаю следующую ошибку:
Попробовал поставить перед классом CompleteAutomata квалификатор package, но это не дало результата. Это сообщение отредактировал(а) AlterMann - 15.7.2013, 11:14 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
На вид нужна какая-то D-библиотека...
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| AlterMann |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Добавил, при сборке С++ проекта, флаг на включение стандартной библиотеки D phobos, причём для разных случаев компиляторов (dmd или gdc) свою соответствующую версию.
Теперь, судя по всему, в случае dmd, недостаёт библиотеки libcurl-gnutils:
которую посмотрев интернет попробовал симулировать: ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4 Но успехом это назвать нельзя, поскольку сообщение о недостатке libcurl-gnutls.so.4 пропадает, но остальные строки об undefined reference to остаются. Может надо откуда-то взять именно эту необыкновенную libcurl-gnutls? В случае gdc как-то по разному всякий раз происходит (что-то меняю, и уже не отдаю себе отчёта в том, что конкретно). Но достаточно часто проявляется ошибка multiple definition of, а также в конце о недостатке librt:
хотя в /usr/lib64 оно присутствует. Подскажите пожалуйста, куда дальше копать? В интернетах нашёл на эту тему лишь только пару гневных постов людей, которые восхищаются D, но продолжают писать на С++, и ругают создателя D (Уолтера Брайта) за то что якобы очень очень часто возникают подобные проблемы линковки. |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Может, линковщик линк не воспринимает? Вообще-то, должен... Пакет libcurl3-gnutls не пробовали? Это как???
Вроде же Вы на unsigned int перешли? Отчётливо видно, что не "якобы"((( Нет никакой чёткой инструкции, одни позитивные утверждения... Вообще, не поймёшь, чего происходит. А Вы не пробовали скачать исходники D и откомпилировать всё это на своём узле? Это сообщение отредактировал(а) feodorv - 16.7.2013, 09:06 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| AlterMann |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Для федоры не удалось сие найти, поэтому пришлось "симулировать". Фик знает. Мистика. Так обычно ругается, когда компилишь код на D, который не имеет main() функции. Но для библиотеки то куда эту main-функцию написать? И почему перед этой ошибкой и после неё проявляются сторонние страсти? Перешёл только для функции createAutomata, поскольку именно её использую в С++ проекте. Всё остальное остаётся в D библиотеке.
dmd из исходников собирать не пробовал, вместо этого скачивал RPM ну а дальше дело техники. Думаете стоит попробовать собрать? gdc нету прекомпиленных (не нашёл), поэтому собрал самостоятельно его. Это сообщение отредактировал(а) AlterMann - 16.7.2013, 09:20 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Точно мистика))) Думаю, да, если есть время и желание. По крайней мере, странные зависимости от неуловимой libcurl-gnutls.so.4 должны пропасть... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| AlterMann |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Долго ли коротко ли, но до меня добрался тот самый мануал, в котором было написано как линковать D код с C++ кодом. Оказывается, в качестве линковщика нужно использовать тот же dmd, и в таком случае всё ок линукется и на выходе мы получаем вполне себе бинарничек. Правда в случае с Qt нужно подобавлять флагов линковки
чтобы были учтены Qt-шные либы. И радость моя была бы безграничной, если бы ещё полученный бинарничек таки заработал бы. Но вместо этого в момент запуска сразу же происходит Segmentation fault (core dumped). По сему печальному поводу gdb выдаёт не достаточно информативный бактрейс:
из которого можно судить о том, что траблы возникают в момент выделения памяти под объект в D коде. Стало быть как-то неправильно мои два кусочка работают друг с дружкою. И нельзя передавать чистый созданный D-объект в C++ код. Видимо нужно передачу такую осущесвлять в D коде, вызывая C++ функцию и передавая ей созданный объект. Но в таком случае это очень плохо, и подобные навороты мне противны. В случае с gdc линковка не удаётся - ругается на какие-то вызовы похожие на работу с тредами... |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |