dartsergius |
|
Темы:
18
Сообщения:
238
Участник с: 15 декабря 2011
|
Собственно навеяно тем, что надо было приткнуть чужую шарповску либу к проекту на С++ ( Qt ). Казалось бы все просто, возьми майкрософтовский компилятор, включи поддержку clr, и работай! Однако не все оказалось так просто, как видится это на первый взгляд. Для начала что мы имеем(в моем случае): + MVSC 2012 + Qt 5.3 + mingw 4.8 + mvsc 2012 opengl + mvsc 2012 + mvsc 2013 А так же нормально документированную библиотеку на C#, которая ничего в NET не экспортирует. Ну не экспортирует, ну и ладно. Для начала попробуем перевести наш проект в проект для студии, и просто напросто подцепить туда эти библиотеки, с помощью настроек проекта ( "Ссылки"). И естественно попытались собрать весь проект. Несложно догадаться, что ничего не вышло. Произошел конфликт макроса с названием функции ( в недрах QDate была вызвана функция min, а зачем-то хедеры windows сделали макрос ). Ну и ничего, undef перед подключением требуемых хедеров спасает, либо просто подключать надо раньше, и все будет нормально. Но даже когда все собралось, начались проблемы уже в рантайме. Qt имеет очень удобный синтаксис сигналов и слотов( по указателям ), и благодаря поддержку компилятором лямбда функций все становиться все просто прекрасно! Но не сейчас. Под гнетом CLR декодирование имен функций поменялось(скорее всего), и в итоге у нас воабще ничего не работало. Казалось бы, что использование директивы pragma , и все наши проблемы решены: Но не на этот раз. Я точно не понял почему( свое предположение я высказал выше ), но такой код: в рантайме выдавал ошибку о несуществующем сигнале dataChanged. Однако если использовать старый синтаксис и заводить отдельно слоты, то все работало. Но в студии нету помощи по "этому синтаксису сигналов и слотов". Потому программирование превращалось просто в ад, ибо надо было дописывать все параметры к каждому сигналу и к каждому слоту. И ошибись хотябы на буковку: при компиляции все будет хорошо, но работать не будет, и лишь маленькая строчка в быстро бегущем логе поведует причину сего непотребства.Дальше решение пришло само, и я не знаю насколько оно все таки правильное. Я отделил часть, которая общается с NET ( там включен clr:oldSyntax ), и собрал её в статическую библиотеку, которую потом свободно подключил к текущему проекту. Только везде пришлось использовать один и тот же компилятор: mvsc 2012. После такого и сигналы и слоты заработали с лямбдами, и подсветка с подсказками в QtCreator-e были исчерпывающими. Но так как работа в этом направлении над проектом ещё не окончена, то могут и в этом способе возникнуть всякие подводные камни... Может быть у вас уже был опыт в подобном совмещении языков, и вы можете подсказать более правильный способ взаимодействия этих языков? |