Страницы

Поиск по вопросам

Показаны сообщения с ярлыком библиотеки. Показать все сообщения
Показаны сообщения с ярлыком библиотеки. Показать все сообщения

пятница, 13 марта 2020 г.

Как в Android Studio подключить в один проект другой, независимый от текущего

#android #android_studio #gradle #библиотеки


В сети много информации об этом не хитром деле, но мне все же не понятен один момент.

Есть 2 android - приложения. Для этих двух приложений существует общая библиотека.
Эта схема успешно работала в Eclipse.

Сейчас же, когда перешел на Android Studio, я пытаюсь повторить тот же фокус (разными
способами), но у меня не получается. 

Я хочу сделать ссылку на указанный библиотечный проект. Чтоб все изменения сразу
отражались во всех приложениях, к которым эта библиотека подключена. А все что у меня
получается это с сделать копию библиотечного проекта. В таком случае не о какой общности
библиотеки речи не идет.

Как быть?
    


Ответы

Ответ 1



Android Studio для сборки проекта использует систему сборки Gradle, поэтому решается данный вопрос через возможности именно данной системы сборки, а не непосредственно Android Studio Для того, чтобы подключить в свой проект другой, независимый от текущего, проект (например, разрабатываемую вами же библиотеку) в Android Studio, необходимо в файле settings.gradle текущего проекта добавить ссылку на другой проект: include ':myLibrary' project(':myLibrary').projectDir = new File('../MyProjects/myLibrary') Здесь мы подключаем к текущему проекту проект myLibrary. ../MyProjects/myLibrary - путь до подключаемого проекта. Ссылка на подключенный проект появится в дереве файлов Android Studio, при редактировании вы будете вносить изменения непосредственно в сам проект, а не его копию в текущем проекте. Теперь при сборке вашего текущего проекта в него будет включен и подключенный проект, при этом данный проект не будет импортирован в текущий и вы можете вносить изменения в тот подключенный проект, тогда они будут учитываться при следующей сборке во всех проектах, в которых он подключен таким образом. Пост на EnSO с картинками

Ответ 2



Сделайте библиотеку отдельным проектом и при компиляции публикуйте ее в каком-нибудь репозитории. В локальном Maven, к примеру. А в любом проекте просто подключайте ее из репозитория, как и любую другую библиотеку.

вторник, 25 февраля 2020 г.

Библиотека для работы с JSON для iOS

#xcode #objective_c #ios #json #библиотеки


Нашел следующие библиотеки:

SBJSON
JSON kit
Touch JSON (как я понял устарел и не поддерживается)

хочется поинтересоваться что пользуется бОльшим успехом и какие особенности этих
библиотек. И возможно какая лучше.     


Ответы

Ответ 1



Советую выбирать Вам между NSJSONSerialization и JSONKit. Про разницу между ними ничего особенного не скажу, обе библиотеки делают свое дело. Что касается их производительности, то разница у них незначительная (JSONKit быстрее, но не намного) и к тому же редко когда вы столкнетесь с тем, что именно производительность разбора JSON будет для вас bottleneck. Смотрите на эту тему очень поучительный комментарий автора библиотеки RestKit. Единственный довод за NSJSONSerialization - это отсутствие лишней зависимости от сторонней библиотеки (я имею в виду зависимость от JSONKit в случае, если вы выберете её), хотя, если вы пользуетесь Cocoa pods, этот довод становится совсем еле заметным. Довод против NSJSONSerialization и в пользу JSONKit - это что JSONKit удобнее в использовании - я пользуюсь JSONKit главным образом из-за того, что она добавляет удобные категории к классам NSArray, NSDictionary, NSString. И вместо того, чтобы писать каждый раз заново строки NSJSONSerialization типа NSJSONSerialization *yourResponse = [NSJSONSerialization JSONObjectWithData:yourData options:0 error:&jsonError]; NSArray *yourObjects = (NSArray *)yourResponse; При использовании JSONKit Вам достаточно будет написать NSArray *yourObjects = yourData.objectFromJSONData; На мой взгляд это удобно и незаметно. Настолько незаметно, что я даже не сразу вспомнил какой JSON-библиотекой я пользуюсь, когда прочитал Ваш вопрос. ОБНОВЛЕНО ПОЗЖЕ Мой взгляд на этот вопрос изменился с тех пор, как я отвечал на него полтора месяца назад. Сейчас я бы советовал использовать исключительно родной NSJSONSerialization. Вот несколько причин: JSONKit, похоже, накрепко заброшен автором. Xcode 5 выдаёт очень много Warning'ов по поводу JSONKit, как он есть, и автор никак не реагирует на соответствующие репорты (если интересно, см. многочисленные issues вроде #121 в его репозитории на Github). Вот эти Тесты производительности на SO показывают, что NSJSONSerialization работает быстрее или как минимум наравне с JSONKit (начиная с iOS 6). Если вы используете для работы с сетью AFNetworking, то он за кулисами разбирает JSON с помощью NSJSONSerialization, и вам вообще не нужно думать о том, какой JSON парсер выбирать и использовать, так как за вас всё уже сделано и вы получаете готовые свои ответы уже завернутые из JSON в NSDictionary/NSArray. Кратко: используйте NSJSONSerialization!

Ответ 2



Мне нравится NSJSONSerialization, вполне самодостаточен, и да чутка не удобен. Очень нравится KISSXML к нему есть категории расширяющие работу с JSON и XML. ну и я за JSONKit Сравнение

воскресенье, 9 февраля 2020 г.

Зачем в библиотеках используются макросы вместо языковых конструкций?

#cpp #библиотеки #макросы


Объясните, пожалуйста, зачем в стандартной библиотеке, в библиотеках boost и во многих
других библиотеках некоторые ключевые слова, названия пространств имен, функций и т.п.
оформляются в виде макросов? Например, _XSTD, NOEXCEPT, THROW, and и еще многие другие.
При этом имеются ввиду т.н. «рабочие» макросы, т.е. те, которые взаимодействуют с основным
кодом на C++, а не что-то платформенное типа _MSC_VER или __WIN__. Хотелось бы услышать
в ответе некоторые причины/варианты использования в библиотеках макросов.
    


Ответы

Ответ 1



Что касается использования макросов вида THROW, CATCH и т.п., то такие вводятся для возможности отключить механизм исключений при необходимости (пустое определение). Макросы вида NOEXCEPT, DEFAULT и т.п. вводятся с той целью, чтобы бибилотека могла работать с более старыми версиями компиляторов. Например, в boost имеется config-файл, в котором содержатся директивы #define, определяющие или не определяющие, например, BOOST_HAS_CXX_RVALUE_REFERENCES или BOOST_HAS_NOEXCEPT - это зависит от версии компилятора. Далее, #ifndef-ом определяется соответствующий макрос - либо вводя его как альтернативу, например, тому же noexcept, либо делая его «пустышкой».

Ответ 2



Мало ли как придется в новой версии объявлять функции? Вдруг изменится какой-то тип? Или, например, реальная ситуация - изменение спецификации исключений в новом стандарте. Или эти исключения просто нужно будет отключить? Или сейчас компилятор понимает throw(), но пока не понимает noexcept? Словом, максимально обезопасить себя от будущих неприятностей - чтобы при необходимости внесения изменений внести их в минимальном объеме. При этом еще и нужно сделать так, чтобы это работало и в C, и в C++. Да еще и разрабатывалось это все лет 30 назад, а то и раньше. Вот так и стали использоваться именно макросы - как наиболее отвязанное от языка и доступное в те времена, когда еще и C++ не было :) средство. "По-моему, так." (с) Пух

среда, 5 февраля 2020 г.

Дистрибуция приложения, зависящего от библиотеки, не присутствующей в репозиториях

#windows #cpp #qt #библиотеки #linux


Мое приложение зависит от библиотеки, которая существует только в виде исходников.
Она имеет лицензию LGPL, поэтому я не могу статически прилинковать ее к приложению.
Возможно ли сделать так, чтобы она лежала в папке с приложением и бралась оттуда? Как
это сделать? Приложение и библиотека на Qt и собираются в Linux и Windows.
Я спрашиваю о том, как сказать приложению, что библиотеку надо искать не в /usr/bin,
а в папке с бинарником?    


Ответы

Ответ 1



@Robotex, на Ваш вопрос Т.е. я не имею права скомпилить библиотеку в .so и положить внутрь пакета с моим приложением? я бы ответил отрицательно. Действительно, самыми простыми способами будет: установить .so (например в /usr/local/bin), прописать ее в /etc/ld.so.conf.d и запустить ldconfig (или перезагрузить комп) прописать в LD_LIBRARY_PATH путь к библиотеке (в составе приложения) где-нибудь в ~/.bashrc запускать приложение через shell скрипт, в котором прописать в LD_LIBRARY_PATH путь к библиотеке Но, все эти способы требуют некоторых действий по установке приложения, а иногда хочется что-то вроде tar xvf my-progs.tar export PATH=$PATH:/tram-pam-pam/my-progs и my-bestprog arg1 arg2 Такую штуку можно сделать, написав некую "обертку" к программе, использующей .so, если известно взаимное (относительное) расположение "обертки", программы и оглавления с .so "Обертка" будет вычислять абсолютный путь, откуда ее запустили (в смысле где она лежит), добавлять к environment LD_LIBRARY_PATH путь к библиотеке и запускать основную программу. Например это можно реализовать так: // txaxa.c программа вызывающая функцию xaxa() из shared library #include #include int main (int ac, char *av[]) { int i; for (i = 0; i < ac; i++) printf ("av[%d] = [%s]\n",i,av[i]); xaxa("xa-xa"); exit(0); } А это функция в shared library // xaxa.c эта функция помещается в shared library libxaxa.so #include void xaxa (char *txt) { printf ("shared lib xaxa(): %s\n",txt); } Соберем приложение xaxa avp@avp-ubu1:~/hashcode/tst$ gcc -fPIC -shared xaxa.c -o libxaxa.so avp@avp-ubu1:~/hashcode/tst$ gcc -o xaxa txaxa.c -L. -lxaxa Добавим "обертку" // rxaxa.c добавляет к LD_LIBRARY_PATH ./lib, где в ./lib/libxaxa.so лежит xaxa() // и вызывает "приложение" xaxa (txaxa.c) #include #include int main (int ac, char *av[]) { fprintf (stderr,"%s\n", exewithlibso ("./xaxa","lib",av)? "Can't find path to executable": "execvp error\n"); exit (1); } И соберем в каталоге .prog наше приложение avp@avp-ubu1:~/hashcode/tst$ gcc rxaxa.c guessfrom.c -o rxaxa avp@avp-ubu1:~/hashcode/tst$ mkdir prog avp@avp-ubu1:~/hashcode/tst$ mkdir prog/lib avp@avp-ubu1:~/hashcode/tst$ cp libxaxa.so prog/lib/ avp@avp-ubu1:~/hashcode/tst$ cp xaxa rxaxa prog/ avp@avp-ubu1:~/hashcode/tst$ tar cvf my-prog.tar ./prog/ ./prog/ ./prog/lib/ ./prog/lib/libxaxa.so ./prog/xaxa ./prog/rxaxa Теперь распакуем .tar куда-нибудь и можно вызывать (все работает) avp@avp-ubu1:~/hashcode/tst$ cd /tmp avp@avp-ubu1:/tmp$ tar xf /home/avp/hashcode/tst/my-prog.tar avp@avp-ubu1:/tmp$ ./prog/rxaxa call xaxa av[0] = [./prog/rxaxa] av[1] = [call] av[2] = [xaxa] shared lib xaxa(): xa-xa avp@avp-ubu1:/tmp$ PATH=$PATH:/tmp/prog/ avp@avp-ubu1:/tmp$ cd avp@avp-ubu1:~$ pwd /home/avp avp@avp-ubu1:~$ rxaxa call xaxa and it works av[0] = [rxaxa] av[1] = [call] av[2] = [xaxa] av[3] = [and] av[4] = [it] av[5] = [works] shared lib xaxa(): xa-xa avp@avp-ubu1:~$ А вот функции, которые делают эту штуку // avp 2012 #include #include #include #include #include #include #include #include /* Разбивает путь к файлу (pname) на имя файла и каталоги Каталаги возвращаются в path Имя файла в name */ static void splitpathname(char *pname, char *path, char *name) { char *p = pname+strlen(pname)-1; *path = *name = 0; while ((p >= pname) && (*p != '/')) p--; strcpy(name,p+1); if (p > pname) strncat(path,pname,p-pname); } /* Проверяет можно ли выполнить (exec) путь av0 Если да, возвращает 1 и кладет в pfrom absolute path к программе, а по адресу exe (если не NULL) последний компонент из av0 (имя программы) иначе возвращает 0 */ static int checkexe (char *av0, char *pfrom, char *exe) { struct stat st; if (stat(av0,&st) == 0 && (st.st_mode & S_IFREG) && access(av0,X_OK) == 0) { char name[PATH_MAX], path[PATH_MAX]; splitpathname(av0,path,name); if (path[0]) { char curwd[PATH_MAX]; getcwd(curwd,PATH_MAX); chdir(path); getcwd(pfrom,PATH_MAX); chdir(curwd); } else { strcpy(pfrom,"."); } if (exe) strcpy(exe,name); return 1; } return 0; } static int getpathpart (char **pb, char *p) { if (!*pb) return 0; char *t = *pb; int l = 0; while (*t && *t == ':') t++; if (*t) *pb = t; while (*t && *t != ':') p[l++] = *t++; p[l] = 0; return l; } /* Функция определяет абсолютный путь к запущенной программе по значению argv[0] с учетом envirinment PATH Returns 1 OK 0 установить путь не удалось В случае успеха возвращает в pfrom найденный путь (без имени программы), а в exe имя программы */ int guessfrom (char *av0, char *pfrom, char *exe) { if (!av0 || *av0 == 0) return 0; if (checkexe(av0, pfrom, exe)) return 1; int l; char *beg, pexe[PATH_MAX]; for (beg = getenv("PATH"); l = getpathpart(&beg,pexe); beg += l) { pexe[l] = '/'; strcpy(pexe+l+1,av0); // printf ("pexe: [%s]\n",pexe); if (checkexe(pexe,pfrom,exe)) return 1; } return 0; } /* Добавляет компонент в начало environment переменной типа LD_LIBRARY_PATH, PATH и т.п. */ void addtopath (char *pathname, char *elem) { char *p = getenv(pathname), *t; int l = strlen(elem); if (p && (t = strstr(p,elem))) { if (t[l] == 0 || t[l] == ':') return; } char newpath[l+1+ (p? strlen(p): 0)]; strcpy(newpath,elem); if (p) { newpath[l] = ':'; strcpy(newpath+l+1,p); } setenv (pathname,elem,1); } /* Запускает программу, добавляя компонент к LD_LIBRARY_PATH prog - относительный путь к программе libdir - относительный путь к оглавлению с .so, добавляемому к LD_LIBRARY_PATH av - аргументы (включая argv[0]) запускаемой программы Returns 0 - не удалось выполнить execvp -1 - не удалось определить путь к программе */ int exewithlibso (char *prog, char *libdir, char **av) { char path[PATH_MAX]; if (guessfrom(av[0], path, 0)) { // printf ("I am from: [%s]\n",path); int l = strlen(path); path[l] = '/'; strcpy(path+l+1,libdir); addtopath("LD_LIBRARY_PATH",path); // printf ("ld_path: [%s]\n",path); path[l] = '/'; strcpy(path+l+1,prog); execvp(path,av); return 0; } return -1; } Вроде работает. Собственно, подобная идея (правда в плане чтения конфигурационных файлов) о "сомонастраивающихся" программах была у меня давно, а вот заинтересовался Вашим вопросом и реализовал для .so Если понравилось, пользуйтесь.

Ответ 2



(IANAL) Если вы распространяете приложение, которое линкуется с библиотекой под LGPL, то вы должны предоставить способ пересобрать свое приложение с новой версией используемой библиотеки. В случае статической линковки с этой библиотекой, лично я не знаю такого способа, кроме распространения исходного кода. Наверно, можно распространять только соответствующие obj файлы, но вроде это не практикуется. Почему у вас отпал вариант собрать обсуждаемую LGPL библиотеку как .dll / .so и использовать динамическую линковку?

среда, 29 января 2020 г.

Как установить библиотеку boost?

#boost #cpp #библиотеки #visual_studio_2010


Доброго времени суток. Нужна помощь!

Хочу установить библиотеку boost. Во всех туториалах люди заходят в консольку Visual
Studio Command Prompt (2010). Но проблема в том, что я не могу ее найти! Искать в винде
пробовал - не нашел.

У меня экспресс-версия! Дело в этом?    


Ответы

Ответ 1



Библиотека boost - это набор частично компилируемых исходных кодов. В некоторых случаях ничего не нужно собирать, достаточно скачать с официального сайта дистрибутив, разместить в удобном месте и в настройках проекта указать пути. У меня в специальной папке, где я храню библиотеки многоразового использования, лежит подпапка boost_1_56_0. Рядом с нею еще ряд других более старых версий этой библиотеки. В переменные среды (в windows это там же, где и PATH) я заношу переменную BOOST_ROOT, которая указывает на последнюю сборку. Т.е. как появится новая, я создам папку boost_1_XX_Y и переназначу эту переменную. В настройках любых проектов мне достаточно указать $(BOOST_ROOT)\include - для доступа к headers, и $(BOOST_ROOT)\stage\lib32 / $(BOOST_ROOT)\stage\lib64 для доступа к конкретным библиотекам, нужной мне разрядности. Поскольку boost автоматически выдает имена собираемым библиотекам, с учетом компиляторов, которыми они собираются, даже если у Вас разные компиляторы, бинарники удобно сбрасывать в одну папку, как указано выше. С Intel Compiler у Вас получатся libboost_name-iw-type-version.lib. С Visual Studio у Вас получатся libboost_name-vcXX-type-version.lib, где XX - версия компилятора visual studio (не студии, а именно компилятора). С MinGW с gcc у Вас получится libboost_name-gcc-type-version.lib, если мне не изменяет память. При этом для сборки библиотек, которые необходимо собирать, необходимо выполнить одни и те же действия в консоли: Для Intel Compiler это будет в соответствующем Command Prompt. Для Visual Studio это будет в соответствующем Command Prompt. Для MinGW это будет в обычной консоли, если, конечно, путь к bin в MinGW у Вас добавлен в переменную среды PATH. Действия надо выполнить одни и те же. Сначала bootstrap.bat, а потом b2 --help. В хелпе b2 Вы увидите все варианты настройки сборки, чтобы собрать наиболее удобным Вам образом. Строчка будет выглядеть так: b2 параметр1 параметр2 параметр3 ... toolset - его стоит указать, чтобы сборка производилась конкретным компилятором (gcc, intel, visual studio), причем можно указать и версию компилятора. variant, вид сборки, debug или release. Для разработки Вам понадобятся оба варианта. link - Вы выбираете, будет Ваш бинарный код обращаться в dll или содержать "в себе" все используемые алгоритмы. threading - честно говоря, плохо понимаю смысл этой директивы и всегда указываю multi. Редко мы пишем однопоточные приложения. runtime-link - то же, что и link, только для рантайма. address-model - параметр не указан в хелпе, но помогает выбрать архитектуру собираемых библиотек. stage/install, отличаются лишь тем, что install позволит "выгрузить" только нужное в отдельную папку, stage собирает всё туда, где оно есть. Если Вы не увлекаетесь изменениями исходников boost, stage Вам вполне подойдет. В итоге получается что-то вроде вот такого: b2 toolset=vc120 variant=debug link=shared threading=multi runtime-link=shared address-model=32 stage Для дебага в x32 и такого: b2 toolset=vc120 variant=release link=static threading=multi runtime-link=shared address-model=32 stage Для релиза в x32. Ждете около 40 минут, радуетесь результату. В случае проблем - гуглите, скорее всего уже тысячи людей сталкивались с Вашей проблемой, и ее решение - невнимательность или какие-то специфические настройки чего-нибудь. Например, при сборке boost python вылезает много warning-ов на MinGW из-за конфликта хедеров, подобные вещи можно разрулить в частном порядке. Потратив 2 часа на то, чтобы один раз в этом разобраться, Вы никогда не будете зависеть ни от каких сторонних сборок, будете понимать, где у Вас что лежит, кто туда положил и т.п. В общем, это полезно. ЗЫ: Command Prompt находится в Visual Studio Tools. Или посмотрите в VStudio_PATH\CommonXX\Tools\VsDevCmd.bat

Ответ 2



Наверное, самый простой способ - это установить заранее собранный пакет под ваш компилятор. Брать тут.

Ответ 3



Есть программка, называется BlueGo, по адресу: ссылка. Это сборник различных библиотек в том числе и boost, но плюс ее в том, что там есть абсолютно все версии, начиная со старых и заканчивая новыми. Выбираешь версию, выбираешь чем компилировать, выбираешь состав сборки и ждешь окончания.

четверг, 9 января 2020 г.

Вопрос о совместимости библиотек

#visual_studio #visual_cpp #dll #библиотеки #совместимость


Нужно написать программу, использующую существующие библиотеки. Есть файлы *.dll,
*.lib и *.h соответственно. В документации к библиотеке написано, она была создана
с помощью компилятора Visual C++ 2008. Не знаю, имеет ли значение, вроде как библиотека
используют в т.ч. MFC.

Вопросы:


Что бы эти библиотеки можно было использовать, на компьютере должен быть установлен
Redistributable Package Visual C++ 2008? Или можно более новую версию, без старой?
Правильно ли я полагаю, что библиотеки были созданы в visual studio 2008, т.к. в
документации указан компилятор Visual C++ 2008?
Для написания программы, использующей данные библиотеки, обязательно ли нужно тогда
использовать, соответственно, vs2008? Или можно, скажем студию 2010 или 2017? Нужны
ли тогда дополнительные "телодвижения"? Если "инструкция" большая, где об этом почитать?
Как узнать версию компилятора, в которой была создана библиотека, например, не имея
документации к ней?


Спасибо
    


Ответы

Ответ 1



Как узнать версию компилятора, в которой была создана библиотека, например, не имея документации к ней? Например, выполнить в командной строке Visual Studio команду dumpbin "путь к dll" /imports, найти в ее выводе импорты вида "MSVCR..." или "vcruntime..." и воспользоваться следующей таблицей для определения версии: Visual Studio 2002 MSVCR70.DLL Visual Studio 2003 MSVCR71.DLL Visual Studio 2005 MSVCR80.DLL Visual Studio 2008 MSVCR90.DLL Visual Studio 2010 MSVCR100.DLL Visual Studio 2012 MSVCR110.DLL Visual Studio 2013 MSVCR120.DLL Visual Studio 2015, 2017 vcruntime140.dll Источник: http://matthew-brett.github.io/pydagogue/python_msvc.html Вместо командной строки можно использовать и графические утилиты, например, Dependency Walker. Способ не сработает, если библиотека статически связана с CRT, или не использует CRT вовсе.

Ответ 2



Все зависит от того, как библиотека была построена. Если .dll была собрана со статической линковкой и экспортирует функции как extern "C", то Redistributable Package для нее не требуется, и скорее всего (не проверял, так что неточно) ее можно будет использовать с более новыми версиями студии. Если библиотека была собрана с динамической линковкой, то использовать ее получится только в VS 2008, и для работы ее потребуется либо установленная VS 2008, либо Redistributable Package, причем именно 2008. Компиляторы разных студий по объектному формату несовместимы, причем несовместимым может быть даже тот же самый компилятор после апдейта. Сам влетел в такую ситуацию пару месяцев назад после обновления VS 2017. Пришлось перекомпилировать много чего, включая чужие библиотеки, это было непросто. Теперь от апдейтов как от чумы, хотя VS 2017 кривой до изумления. Правильно ли я полагаю, что библиотеки были созданы в visual studio 2008, т.к. в документации указан компилятор Visual C++ 2008? Необязательно в студии, компилятор и прочее можно пускать и из командной строки. Но в целом да, так и есть. Как узнать версию компилятора, в которой была создана библиотека, например, не имея документации к ней? Версия там есть, потому что компилятор ее проверяет, но где она лежит надо серьезно копать. Проще попробовать собрать с ней что-нибудь и посмотреть что напишет в сообщении об ошибке. Или не напишет. Как-то так. Точно вам разве что в саппорте MS скажут. В целом быстрее будет разобраться экспериментируя.

Ответ 3



1) Это зависит от того, имеются ли в библиотеке специфические вызовы и ресурсы. Сказать однозначно, нужен пакет или нет, невозможно. Нужно запустить и посмотреть. 2) Теоретически, библиотеки могут быть собраны в любом окружении, даже на другой операционной системе. Но обычно, если говорят, что проект/библиотека собираются в VS C++ 2008, то так оно и есть. 3) Степень телодвижений для использования библиотеки зависит от того, как именно эта библиотека реализована. Тут нет общего правила. Хорошим тоном считается сокрытие всей библиотечной магии под сишными интерфейсом. Такой подход позволяет выставить наружу простой интерфейс, который может быть использован различными компиляторами и даже другим языковым окружением. Обычно, при использовании сишного интерфейса значение имеет только разрядность используемого вами компилятора - она должна совпадать с разрядностью компилятора, которым библиотека была собрана. Однако, в мире C++ очень часто бывает так, что в интерфейс библиотеки просачиваются тонкости реализации используемого компилятора. В этом случае библиотеку очень тяжело заставить работать, потому что исключения, шаблоны, искажения имен и вот это все - определяется реализацией и может меняться даже при смене настроек компиляции в одном и том же компиляторе. 4) Версия используемого компилятора вам мало чем поможет. Стандарт C++17 занимает 1700 страниц. Больше половины этого - поведение, определяемое реализацией, то есть - разработчиками компиляторов. Поэтому, если библиотеку не удается подключить к вашему компилятору, при условии, что компилятор имеет подходящую разрядность, то лучше найти другую библиотеку, которая предоставит классический C-интерфейс.

воскресенье, 5 января 2020 г.

Как перегрузить оператор << у cout?

#операторы #перекодировка #cpp #библиотеки


В связи с этим вопросом решил задать другой, как оказалось, более важный вопрос.
В общем я недавно начал изучать C++ и поимел проблемы с кодировками, помогите мне
перегрузить << у std::cout чтобы он принимал строки в utf-8 а выводил в windows-866. 
    


Ответы

Ответ 1



Собственно, перегрузить сможете, только если будете передавать какой-то тип, отличный от string, char* и пр., поскольку << у cout уже перегружен для них. Можно просто создать функцию с такой вот примерно сигнатурой void printunicode (ostream&, const string&) В ней собственно переводите юникодное содержимое строки в нужную кодировку, записываете его в буфер, а его уже передаете потоку. Или даже проще. Создаете функцию, которая принимает строку с юникодом, а возвращает в нужной кодировке. Тогда можете ее использовать в череде операторов <<.

Ответ 2



Помню как заминусовали когда в прошлый раз ответил на свой вопрос но всё таки отвечу :) Понял что легче всего сменить кодировку файла на целевую (хорошо что я не японец :) ). В общем для Code::Blocks сделал так: 1) Скачал uniconv.exe (давно качал счас не помню где) 1a) Т.к. uniconv не поддерживает utf-8 поставил по умолчанию в code::blocks windows-1251 2) Добавил в Tools такой Tool: 3) И если работаю с D:\ProjectsC++\C++ Learning\Chapter 2\Homework\Ch2_Ex1.cpp: #include int main(){ using namespace std; cout << "Привет! " << endl << "Моё имя: Иван." << endl << "Моя фамилия: Черновалов."; cin.get(); return 0; } и вызываю tools=>reCHARSET WD то получаю D:\ProjectsC++\C++ Learning\Chapter 2\Homework\Ch2_Ex1.cpp.cpp в windows 866 затем вручную :( открываю его и вижу: #include int main(){ using namespace std; cout << "ЏаЁўҐв! " << endl << "Њ®с Ё¬п: €ў ­." << endl << "Њ®п д ¬Ё«Ёп: —Ґа­®ў «®ў."; cin.get(); return 0; } 4) Строю&Запускаю и ву-аля: Может кому поможет... PS: Как видите не могу получить (не создав Project) отдельно имя файла отдельно директорию поэтому приходится использовать двойное расширение чтобы отличать файлы (т.к ели изменять редактируемый файл то ошибка приложения) и приходится вручную открывать файл. Ещё в code::blocks есть Tools+ и Scripts но я не умею ими пользоваться если кто может помогите усовершенствовать мой "костыль" :) чтобы создавался временный файл компилировался с именем текущего и удалялся...

Загрузка библиотек из массива

#c_sharp #массивы #библиотеки


Есть некая программа для которой пользователи пишут расширения (библиотеки) и в каждой
библиотеки стартовым методом является функция "Start()" с одинаковыми параметрами.
Так вот вопрос, как можно подгрузить библиотеки из массива и вызвать их стартовый метод,
если это возможно?    


Ответы

Ответ 1



Конечно возможно! // Получаем все dll FileInfo[] files = new DirectoryInfo("Директория с нашими плагинами").GetFiles("*.dll"); foreach (FileInfo fi in files) { // Получаем assemly из файла var assembly = Assembly.LoadFile(fi.FullName); // Ищем нужный тип foreach (Type type in assembly.GetTypes()) { ... // Нашли => Создаем экземпляр. Вместо многоточия идут параметры конструктора return Activator.CreateInstance(type, ...); } } Обычно, когда подобное реализуют, то описывают интерфейс, а в библиотеках описывают классы, которые его реализуют. В Вашем случае он будет выглядеть например так: public interace IMyInterface { void Start(...); } И тогда можно перебрать в библиотеке классы, реализующие его: // Ищем нужный тип foreach (Type type in assembly.GetTypes()) { // Проверяем является реализует ли тип type наш интерфейс if (!typeof (IMyInterface).IsAssignableFrom(type)) continue; ... // Нашли => Создаем экземпляр. Вместо многоточия идут параметры конструктора return Activator.CreateInstance(type, ...); }

воскресенье, 29 декабря 2019 г.

Устройство библиотек C++

#cpp #библиотеки


Здравствуйте меня интересует устройство работы библиотек, именно: для чего используются
.DLL файлы библиотек и как они свзяаны с .lib файлами, которые кладутся в папку lib
компилятора, с файлами *.h ,которые кладутся в сам проект, почему нельзя просто добавить
.h файл в проект? 
Прошу мне объянснить, т.к сам в этом не разбираюсь, извините, если вопрос поставлен
глупо.    


Ответы

Ответ 1



Начнем с основ:) Первоначально компилятор превращает исходный файл в промежуточный формат .obj (т.н. объектный файл), в нем нет ничего кроме машинного кода программы и ссылок на внешние функции библиотек (ссылки получаются из файлов заголовков). В файлах заголовков как правило нет кода, там только объявления ("загловки") процедур и функций. Далее, чтобы превратить объектный файл в исполняемый, его нужно скормить линковщику, но также линковщику нужны еще и файлы .lib, в которых находятся уже скомпилированные функции, на которые есть ссылки в объектном файле. Линковщик все это хозяйство соединяет, и получается готовый исполняемый файл, в котором есть и код программы, и код вызываемых функций. Файлы lib называются статическими библиотеками, т.к. их можно присоединить к программе только во время компиляции. Также, существуют динамические (динамически подключаемые) библиотеки (dinamiс-link libraries, dll), в отличие от статических библиотек, они подключаются либо в момент запуска программы, либо уже после ее запуска. Для того чтобы подключить dll в момент запуска, к программе должна быть прилинкована статическая библиотека lib, в которой есть ссылки на функции библиотеки dll. В сам исполняемый файл добавляются только эти ссылки на функции, но не сами функции из dll.

Ответ 2



.dll - это dynamic-link library (динамически подключаемая библиотека), содержит откомпилированный код предоставляемых библиотекой функций. .lib -- это static libraries (статические библиотеки), представляют собой архив набора объектных файлов, каждый из которых является результатом компиляции одного исходного файла (.c, .cpp). .h файлы обычно содержат только объявления предоставляемых библиотекой функций и констант. Этого достаточно для компиляции кода используюшего библиотечные функции. На выходе компилятора снова получается один или несколько объектных файлов. Для того, чтобы из объектных файлов получился исполняемый файл, их (объектные файлы) нужно слинковать. В процессе линковки разрешаются обращения к библиотечным функциям либо путем вставки реализации из статических библиотек внутрь исполняемого файла, либо путем добавления ссылок на соотв. реализации в динамических библиотеках. Более детальное описание

понедельник, 23 декабря 2019 г.

Правильная установка пакета nuget C#

#c_sharp #библиотеки #nuget


Здравствуйте. Нашел на NuGet бета-версию библиотеки для kinopoisk. Только вот установить
ее не получается из-за ошибки
Можете подсказать что я делаю не так? NuGet начал пользоваться совсем недавно, поэтому
всех особенностей еще не знаю. Если что, то сборки из пункт "Dependencies" пытался
установить. NETStandard.Library (>= 1.6.1) удалось поставить, а вот Apix.Http.Client
(>= 1.0.0-beta-009) нет, т.к. все такая же ошибка появлялась.
    


Ответы

Ответ 1



Библиотека написана под .NETStandard 1.6, для совместимости у вас должен быть установлен .NET Framework 4.6.3. Подробнее о .NET Standard можно прочесть на странице документации. Там же можно найти полную таблицу поддержки для различных платформ.

четверг, 19 декабря 2019 г.

2D графика в linux [закрыт]

#графика #библиотеки #cpp #linux


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Update the question so it
can be answered with facts and citations by editing this post.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
посоветуйте 2D библиотеку вывода графики для linux. хотелось бы что нибудь наподобие
как библиотека под ДОС - graphics.h    


Ответы

Ответ 1



Попробуй Cairo, с его помощью много чего написано. Сам писал на нем небольшой редактор графов.

Ответ 2



нашел сам. библиотека xlib

Ответ 3



Еще можно попробовать Qt.

Ответ 4



Можете попробовать SDL Правда там немного большее чем просто библиотека для работы с 2D графикой.

среда, 18 декабря 2019 г.

Чем плохо писать C++ код в .hpp файлах

#cpp #библиотеки


Встречал и сам писал библиотеки одного .hpp файла. Удобно, что не нужно повторять
код. Чем это может быть плохо?
Вот пример довольно популярной и удачной библиотеки.
    


Ответы

Ответ 1



Плохо в этом то, что вы теряете преимущества раздельной компиляции. Во-первых, это время. Ваша функция будет компилироваться каждый раз, когда cpp-файл включает этот header. Хуже того, теперь при каждом изменении подробностей реализации придётся перекомпилировать не один cpp-файл с имплементацией, а все, которые включают ваш header. Во-вторых, это увеличивающееся количество зависимостей. Если вам для декларации функции не нужны другие header'ы, а для имплементации нужны, то теперь вы вынуждены включать всё в header, и значит, все, кто его используют ваш header, тоже будут «видеть» эти другие header'ы. К этому непосредственно примыкает и проблема номер 3: кольцевые зависимости. Допустим, у вас есть две функции в разных файлах, которые вызывают друг друга. Если в header'ах только декларации функций, то cpp-файлах можно подключить недостающий header, и функции могут легко ссылаться друг на друга. В случае, когда имплементация в header'е, такое не пройдёт из-за взаимной рекурсии включений, и вам придётся идти на уродливые трюки наподобие «точно знать, какие функции нужны другому header'у, и предварительно объявить их перед включением». И наконец, вы теряете инкапсуляцию: любой может видеть вашу имплементацию, и это провоцирует кодировать используя знание о том, как же там всё реально устроено (что по очевидным причинам плохо). Заметьте, что если ваша функция — шаблонная, то вам скорее всего таки придётся объявлять её полностью в header'е, и столкнуться со всеми вышеперечисленными проблемами.

Ответ 2



Реализация в заголовочных файлах не просто возможна, но и требуется в нескольких случаях. В частности, при реализации обобщённых типов, они же шаблоны (templates), а также при реализации встроенных (inline) функций. С другой стороны, в некоторых случаях такая реализация может привести к ошибкам во время линковки, поскольку одна и та же функция окажется в разных .obj-файлах. Чтобы этого не произошло, функцию необходимо объявить статической (static), тогда она не будет видна из других объектных модулей. Фактически, это означает, что в каждом объектом модуле будет своя копия этой функции. Хочу обратить внимание, что в данном случае речь идёт не о статических методах класса, которые также принято обозначать ключевым словом static. Резюме: это не плохо, и иногда необходимо. Главное, понимать, что и зачем вы делаете.

Ответ 3



Принципиально ничего плохого в этом нет. Вон boost больше чем на половину в заголовках реализован. Минусы это увеличение времени компиляции и размера бинаря (не обязательно).

воскресенье, 15 декабря 2019 г.

Как интерполировать полилинию в кривую

#cpp #математика #библиотеки


Подскажите, пожалуйста, библиотеку?
Обязательно сохранить исходные точки. Поясню, что дана именно 2D-полилиния, а не
мат. функция. То есть, координата X последующей точки может быть меньше координаты
X предыдущей точки.
Примерный интерфейс: на входе вектор с точками, точность(сколько соседних точек участвуют
в расчетах); на выходе новый, "сглаженный" вектор.
Знает ли кто-нибудь такие библиотеки (желательно попроще) или функции?    


Ответы

Ответ 1



Ранее пытался применить метод Лагранжа для функции, найденный здесь. Но у него особенность: при большом кол-ве точек, появляется сильная амплитуда. Не подошло. Есть похожее решение для сплайновой интерполяции? При любой интерполяции при большом количестве точек будут "биения". Чтобы сгладить надо использовать аппроксимацию либо методом наименьших квадратов с заданным порядком полинома (пусть того же Лагранжа или Чебышева) или применить метод Безье

Ответ 2



Ничто не мешает провернуть сплайновую интерполяцию для отдельных фрагментов полилинии - для метода spline interpolation нет ограничения на то, чтобы кривая была функцией. В качестве доп. пищи для размышлений - гугл "smoothen polyline" и вот эти статьи: http://www.cs.ait.ac.th/~guha/papers/simpliPoly.pdf http://cipic.ucdavis.edu/education/CAGDNotes/Chaikins-Algorithm/Chaikins-Algorithm.html

воскресенье, 8 декабря 2019 г.

Контейнер deque в STL c++

#cpp #шаблоны_с++ #stl #библиотеки #контейнеры


Я начал изучения библиотеки STL и нашел такой интересный контейнер, как deque, но
я не понял, в чем его преимущество, если можно заменить его другими контейнерами из
того же STL?
    


Ответы

Ответ 1



А чем вообще один контейнер отличается от другого? И вообще, все их можно заменить обычным массивом... В конце концов, какая разница, искать ли элемент в контейнере час или пару секунд, или - ну что тут такого страшного, если вставка в начало массива требует перемещения всех его элементов? Или это существенно? Тогда учтите, что дек обеспечивает быструю вставку-удаление с обоих концов контейнера - чего, например, не может обеспечить vector, но при этом быстрое (хотя чуть медленнее, чем у vector) обращение к любому элементу внутри, чего, например, не может обеспечить list. Но при этом он не может обеспечить быстрый поиск, как у set или unordered_set... Ну, а чтобы вам было легче выбирать, какой именно контейнер вам нужен - вот неплохая шпаргалка: Еще одна сводная шпаргалка по функциям контейнеров:

понедельник, 25 ноября 2019 г.

Разница между фрэймворком, библиотекой и API?


Так в чём на самом деле разница между фрэймворком, библиотекой и API?
Есть мнение, что всё это близкие понятия, везде есть классы и методы которые можно встроить в клиентский код.
И всё же, похоже есть существенные отличия?
    


Ответы

Ответ 1



Начнём с API. Это самый простой вариант: возможность для приложения обратиться коду вне этого приложения. Это набор функциональности для того, чтобы заставить внешнюю для программы сущность сделать свою работу. Пример из реальной жизни: у вас есть в квартире водопровод, а API — телефон сантехника, который этот водопровод может починить, если надо. Теперь, библиотека — это готовый к использованию набор кода, который бежит в контекст приложения, и точно так же выполняет свою работу. То есть библиотека становится пр подключении частью приложения. Разница между библиотекой и API может быть довольно тонкой: например, WinAPI предоставляет функциональность, которая в общем-то иногда происходит и в рамках процесса. Тем не менее, это считается обращением к внешней для приложения платформе. Пример из реальной жизни: вы сами не сколачиваете шкаф, а покупаете домой готовый, ставите в свою квартиру и пользуетесь им. Шкаф — ваша подключаемая библиотека. Ну и фреймворк — его функции, в отличие от библиотеки, не вызываются вами, а наоборот ваш код вызывается из него. Фреймворк можно представить себе в виде полуфабриката приложения, к которому вы дописываете нужную функциональность сами. Пример из реальной жизни: вы покупаете почти готовую квартиру, а мебель, обои и шкаф добавляете сами. Квартира — ваш фреймворк, она уже почти готова. Вы не можете так просто переделать число комнат или превратить её в корабль, вместо этого вы только добавляете внутреннюю функциональность: паркетный пол, махровый халат в ванной и кота.

Ответ 2



Если Вы попользуетесь каждым поймете разницу. API: Чаще всего подразумевает интерфейс взаимодействия. Используется для работы с независимым сервисами. Допустим, Вы хотите выкладывать видео на YouTube, то будете пользоваться их функциональностью через API. Библиотека: Чаще всего набор готовых классов, методов, решений типичных задач. Заточеных по что то определенное. Допустим, Вы хотите распознавать лица на фотографиях (собственноручно, не используя сторонние сервисы), то установите какую-то OpenCV и будете ее использовать, что бы не изобретать велосипед заново. Фреймворк: Чаще всего включают в себя библиотеки для удобства. И предоставляют Вам готовый шаблон/ приложения, реализуя паттерны проектирования (MVC, MVVC или другие). Фреймворк обычн состоит из готовых модулей, которые между собой жестко связаны (используют интерфейсы друг-друга), при разработке своего модуля необходимо реализовывать интерфейсы для прощей интеграции своих модулей.

Ответ 3



API - это интерфейс взаимодействия с программой извне. У Вас есть сам по себе какой-т готовый продукт и он представляется черным ящиком и Вы хотите, что бы им могли пользоватьс другие программы. Вы определяете методы взаимодействия с ним и описываете их, а сторонние программы им пользуются. Само по себе понятие очень широкое и чаще его все же используют по отношению к удаленным сервисам и запросам вне основного приложения. Грубо говоря API - описание взаимодействия с черным ящиком, что бы он сделал Вам то или иное действие. Библиотека - это сборка различный функций и подпрограмм, которая может быть перенесен и использоваться потом в различных приложениях. Основная идея в том, что они переносимы между приложениями и могут быть многократно использованы без изменений. Фреймворк - это каркас для будущего приложения, в котором собраны все основные необходимы детали: библиотеки, структура, начальный код и т.д. Можно сказать, это минимальная заготовка, на основе которой Вы будете дописывать функционал и строить дальше приложение. Ваше приложение будет работать за счет того, что уже есть и заботливо для Вас заготовлено.

Ответ 4



Библиотека как правило маленькая, создана для чего-то определенного, как правило, одной цели. Например, библиотека календарь на js, график на winforms. API - это выставленный напоказ интерфейс системы: методы, классы и тд, которыми другие люди могут пользоваться. Framework - большая система, охватывает многие вопросы по какой-либо теме. Например .NET Framework. Это куча библиотек для самых разных нужд. Можно писать как веб-приложения, так и winforms, wpf, wcf и другие.

Ответ 5



API это паттерн. Библиотеки и фреймворки предоставляют API. API может создаваться на базе фреймворка. Фреймворк состоит из библиотек или являет собой паттерн их соединения. Библиотека может собираться фреймворком платформы.

Ответ 6



Если на пальцах, то так: Библиотека - это какая-то внешняя логика, к которой ваш код может свободно обращаться, чтобы дёргать некий функционал. Фреймворк - это какой-то готовый каркас, в рамки которого вы должны вписать ваш код. АПИ - это пульт управления, который некоторая система выставляет наружу, чтобы другие системы могли к ней обращаться.

Ответ 7



Api (appliation interface) - доступ к функционалу приложения. Библиотека (сборка - отдельный модуль содержащий набор классов или методов. Ну и framework это не прост набор функционала как api, sdk или библиотека - это полноценная среда разработки, помимо набора классов и методов которые могут быть использованы в вашем приложении фрэймворк дает, нужное подчеркнуть, компилятор, интерпретатор, менеджер пакетов, декомпилятор и многое другое. Например. Net, nodejs, java являются фрэймворками.

Ответ 8



поправьте, если не прав ХОТЬ В ЧЕМ-ТО. Библиотека (*.dll)- тупо примитивно ДРАЙВЕРА.(Отличие драйвера от программы - отсутстви в коде драйвера точки входа (так называемой и всеми любимой функции "main(){}" ...). без psv main(){} программа становится библиотекой (набором классов). Фрэймвок - это СДК, использующий АПИ(которая в свою очередь использует *.dll библиотеки/драйвера) Фрэймворк - это SDK, работающий с помощью API.

вторник, 16 июля 2019 г.

Отображение нескольких изображений как в приложении Vk для iOS

Как расставить картинки в я ячейке NSTableView таким образом:
Есть ли уже готовая библиотека/объект/что-то иное для этого, или придётся высчитывать их положение?


Ответ

Посмотрите что больше Вам подойдет https://github.com/Lascorbe/LAAnimatedGrid https://github.com/AlvinNutbeij/DWGridController https://github.com/bryceredd/RFQuiltLayout https://github.com/aceisScope/WaterflowView https://github.com/norsez/BDDynamicGridViewController

четверг, 11 июля 2019 г.

VS15 библиотеки компоновщика

Каждый раз когда делаю новый проект приходится прописывать библиотеки для opengl
glaux.lib glu32.lib glui32.lib glut32.lib opengl32.lib
Как сделать чтобы эти библиотеки были по умолчанию в компоновщике Visual Studio


Ответ

Для этого существуют Property Sheets. Я записал gif-ку. Сначала откройте окно Property Manager в Visual Studio. (Edit->Other windows->Property manager).
Затем нажмите Add New Project Property Sheet. Введите имя (скажем, "Opengl") и сохраните в какой-нибудь удобной для вас директории (общей для всех проектов). В дереве Property Manager появится новый Property Sheet "Opengl". Откройте его свойства и добавьте нужные библиотеки в опции линкера. Сохраните настройки.
Теперь вы можете использовать полученный Opengl.props во всех новых проектах. После создания нового проекта, вам надо будет открыть Property Manager и нажать Add Existing Property Sheet.
Вы также можете редактировать дефолтные Property Sheets (например, Microsoft.Cpp.Win32.user) и тогда эти библиотеки будут подключаться ко всем проектам на C++ по умолчанию, но это не рекомендуется.

вторник, 9 июля 2019 г.

Создание библиотеки. Как предоставить возможность ее использовать

Здравствуйте. Написал библиотеку с анимациями, своими классами, методами и т.д. Хочу её выложить на гитхаб. Что нужно сделать чтобы разработчик мог добавить её к себе в проект? Ну, тоесть добавить в dependencies, подключить и использовать? На данный момент она представлена в виде проекта, компилируемая в apk. Делаю впервые, поэтому не понимаю. Вопрос, наверное, детский :D


Ответ

Вам нужно опубликовать библиотеку в какой-нибудь публичный репозиторий. Посмотрите тут: https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

понедельник, 3 июня 2019 г.

Как в Android Studio подключить в один проект другой, независимый от текущего

В сети много информации об этом не хитром деле, но мне все же не понятен один момент.
Есть 2 android - приложения. Для этих двух приложений существует общая библиотека. Эта схема успешно работала в Eclipse.
Сейчас же, когда перешел на Android Studio, я пытаюсь повторить тот же фокус (разными способами), но у меня не получается.
Я хочу сделать ссылку на указанный библиотечный проект. Чтоб все изменения сразу отражались во всех приложениях, к которым эта библиотека подключена. А все что у меня получается это с сделать копию библиотечного проекта. В таком случае не о какой общности библиотеки речи не идет.
Как быть?


Ответ

Android Studio для сборки проекта использует систему сборки Gradle, поэтому решается данный вопрос через возможности именно данной системы сборки, а не непосредственно Android Studio
Для того, чтобы подключить в свой проект другой, независимый от текущего, проект (например, разрабатываемую вами же библиотеку) в Android Studio, необходимо в файле settings.gradle текущего проекта добавить ссылку на другой проект:
include ':myLibrary' project(':myLibrary').projectDir = new File('../MyProjects/myLibrary')
Здесь мы подключаем к текущему проекту проект myLibrary.
../MyProjects/myLibrary - путь до подключаемого проекта.
Ссылка на подключенный проект появится в дереве файлов Android Studio, при редактировании вы будете вносить изменения непосредственно в сам проект, а не его копию в текущем проекте.
Теперь при сборке вашего текущего проекта в него будет включен и подключенный проект, при этом данный проект не будет импортирован в текущий и вы можете вносить изменения в тот подключенный проект, тогда они будут учитываться при следующей сборке во всех проектах, в которых он подключен таким образом.
Пост на EnSO с картинками

вторник, 14 мая 2019 г.

Библиотека для работы с JSON для iOS

Нашел следующие библиотеки: SBJSON JSON kit Touch JSON (как я понял устарел и не поддерживается) хочется поинтересоваться что пользуется бОльшим успехом и какие особенности этих библиотек. И возможно какая лучше.


Ответ

Советую выбирать Вам между NSJSONSerialization и JSONKit. Про разницу между ними ничего особенного не скажу, обе библиотеки делают свое дело.
Что касается их производительности, то разница у них незначительная (JSONKit быстрее, но не намного) и к тому же редко когда вы столкнетесь с тем, что именно производительность разбора JSON будет для вас bottleneck. Смотрите на эту тему очень поучительный комментарий автора библиотеки RestKit.
Единственный довод за NSJSONSerialization - это отсутствие лишней зависимости от сторонней библиотеки (я имею в виду зависимость от JSONKit в случае, если вы выберете её), хотя, если вы пользуетесь Cocoa pods, этот довод становится совсем еле заметным.
Довод против NSJSONSerialization и в пользу JSONKit - это что JSONKit удобнее в использовании - я пользуюсь JSONKit главным образом из-за того, что она добавляет удобные категории к классам NSArray, NSDictionary, NSString. И вместо того, чтобы писать каждый раз заново строки NSJSONSerialization типа
NSJSONSerialization *yourResponse = [NSJSONSerialization JSONObjectWithData:yourData options:0 error:&jsonError]; NSArray *yourObjects = (NSArray *)yourResponse;
При использовании JSONKit Вам достаточно будет написать
NSArray *yourObjects = yourData.objectFromJSONData;
На мой взгляд это удобно и незаметно. Настолько незаметно, что я даже не сразу вспомнил какой JSON-библиотекой я пользуюсь, когда прочитал Ваш вопрос.
ОБНОВЛЕНО ПОЗЖЕ
Мой взгляд на этот вопрос изменился с тех пор, как я отвечал на него полтора месяца назад. Сейчас я бы советовал использовать исключительно родной NSJSONSerialization.
Вот несколько причин:
JSONKit, похоже, накрепко заброшен автором. Xcode 5 выдаёт очень много Warning'ов по поводу JSONKit, как он есть, и автор никак не реагирует на соответствующие репорты (если интересно, см. многочисленные issues вроде #121 в его репозитории на Github). Вот эти Тесты производительности на SO показывают, что NSJSONSerialization работает быстрее или как минимум наравне с JSONKit (начиная с iOS 6). Если вы используете для работы с сетью AFNetworking, то он за кулисами разбирает JSON с помощью NSJSONSerialization, и вам вообще не нужно думать о том, какой JSON парсер выбирать и использовать, так как за вас всё уже сделано и вы получаете готовые свои ответы уже завернутые из JSON в NSDictionary/NSArray.
Кратко: используйте NSJSONSerialization!