четверг, 31 января 2013 г.

LNK2001, unresolved external symbol в MSVC++ при попытке сделать "cross-DLL" вызов

Есть два С++ модуля ("проекта") под одним Solution-ом, 1-й и 2-й. Во 2-м есть класс, метод которого мы хотим вызвать из первого. Оба модуля - динамические DLL. Не линкуется. Объявляем метод виртуальным - всё замечательно. Если не линкуется и после этого - скорее всего, в Project Dependencies для первого модуля, не указан второй модуль.

Как надо: метод класса делаем доступным, добавляя __declspec(dllexport) (между типом возвращаемого значения и именем функции), после чего метод доступен "снаружи". Другой способ - через .DEF файл, но он менее удобен.

Что происходит: после добавления __declspec, помимо DLL файла, для 2-го модуля компилятор создаст LIB файл - как "связующее звено", с помощью которого слинкует вызов метода из 1-го модуля с реализацией (адресом) метода во 2-м модуле. Данный LIB файл является так называемой "import library".
Глянув в настройках 1-го модуля в MSVC (Linker) в command-line, можно заметить, что при корректно выставленной зависимости 1-го модуля от 2-го, среди аргументов присутствует LIB файл 2-го модуля, даже несмотря на то, что он является динамической библиотекой.

Для вызова метода из статических библиотек, дополнительных действий не потребуется - адреса методов фиксированы и известны линковщику. Тем не менее, не стоит забывать правильно расставить зависимости модулей друг от друга (через свойства Solution).
Чуть больше подробностей, с небольшим примером кода, по ссылке.

воскресенье, 20 января 2013 г.

Organize!

Наверняка, многие из вас бывали в ситуации, когда в компании заходил разговор о фильмах, книгах, музыке, и упоминалось какое-то заинтересовавшее вас произведение. Название пишется на бумажке и... оставляется на столе, теряется, или заносится в файлик на рабочем компьютере. Про фильм или книгу мы вспоминаем уже дома, или по дороге. Какое же там было название... и где же тот листочек?.. Чёртов склероз!

Или, к примеру, натыкаетесь вы в интернете на интересную статью, видеоролик, или кто-то присылает ссылку на безумно интересный блог, и вот ведь незадача - чтение / просмотр может отнять весьма продолжительное время, и именно сейчас его у вас нет. Заносим в закладки в своём любимом хроме / огнелисе / опере / сафари (да хоть в ослике), и по дороге домой или уже дома, естественно, вспоминаем. И ведь даже интернет есть, и время. А толку?

суббота, 19 января 2013 г.

JSON как формат обмена данными между C++ и Java


Формат JSON - замечательная штука для структур данных общего вида, с вложенными объектами, массивами, и разными типами в том случае, если вам надо передать один или несколько объектов достаточно сложной структуры между разнородными компонентами - например, между C++ и Java. Как оказалось, даже есть отдельный RFC 4627, где описан JSON.

Для работы с данным форматом на "плюсах", можно воспользоваться библиотекой JSON Spirit, написанной с использованием Boost, применение которой хорошо описано. Библиотека позволяет достаточно легко написать парсер/генератор JSON на C++.

Существует также JSON Schema, которая позволяет в формате JSON описать структуру JSON данных - данные формата JSON описываются с помощью самого JSON. Одно из применений "схемы" - data validation. Кроме того, на основе "схемы" может быть сгенерирован исходный код (правда, не для всех языков). В отличие от формата JSON, "схема" на данный момент "стандартизована" на уровне IETF draft-а. Немного более поздняя версия draft-а доступна на github-е проекта (на момент этого поста - это v04).