LINUX.ORG.RU

Линковка библиотеки libjson

 


0

1

Собрал libjson (брал на sf)

Собирал так

make clean SHARED=1 && make SHARED=1 && sudo make install SHARED=1

Все собралось. Сделал тестовую программку.

#include <iostream>
#include "libjson/libjson.h"

using namespace std;

int main(void) {
    JSONNode n(JSON_NODE);
    n.push_back(JSONNode("RootA", "Hello World"));
    JSONNode c(JSON_ARRAY);
    c.set_name("ArrayOfNumbers");
    c.push_back(JSONNode("", 16));
    c.push_back(JSONNode("", 42));
    c.push_back(JSONNode("", 128));
    n.push_back(c);
    string jc = n.write_formatted();
    cout << jc << endl;
    return 0;
}

Собираю

 g++ json.cpp -o json -ljson
In file included from /usr/include/libjson/libjson.h:4:0,
                 from json.cpp:2:
/usr/include/libjson/_internal/Source/JSONDefs.h:157:6: warning: #warning , Release build of libjson, but NDEBUG is not on [-Wcpp]
json.cpp: In function ‘int main()’:
json.cpp:7:5: error: ‘JSONNode’ was not declared in this scope
json.cpp:7:14: error: expected ‘;’ before ‘n’
json.cpp:8:5: error: ‘n’ was not declared in this scope
json.cpp:9:14: error: expected ‘;’ before ‘c’
json.cpp:10:5: error: ‘c’ was not declared in this scope

Что за чертовщина? Сборки правильно лежит в /usr/lib/



Последнее исправление: zhouck (всего исправлений: 1)

Вангую, что хедеры надо устанавливать отдельно. Инструкция по сборке с программой есть?

hippi90 ★★★★★
()

Скорее всего там всё в какой-то namespace запихнули.

kvap
()

попробуй приложение собрать с NDEBUG, как оно просит, либо посмотри, может там неймспейс какой (в самом заголовочнике)

yoghurt ★★★★★
()

libjson_7.6.1.zip/libjson/makefile

#    install_headers
#      Installs the header files.
#      Default location: $(prefix)/$(includedir) => /usr/include

anonymous
()

Сборки правильно лежит в /usr/lib/

С либами все нормально. Смотри установленные хэдеры. Компиль пример с -DNDEBUG. Если не поможет, то костылем падлу такую попробуй добавить #define NDEBUG в json.cpp.

hippi90

Вангую, что хедеры надо устанавливать отдельно.
/usr/include/libjson/_internal/Source/JSONDefs.h:157:6: warning:

EXL ★★★★★
()

пытаешься использовать статический код в динамической сборке.

читай документацию, раздел Getting Started/Library Interface.

код оттуда собираешься, доказательство ниже:

#!/bin/bash

if [ ! -f libjson_7.6.1.zip ]; then
  wget http://downloads.sourceforge.net/project/libjson/libjson_7.6.1.zip
fi

rm -rf libjson opt* 2>/dev/null
unzip libjson_7.6.1.zip

mkdir opt

pushd libjson
sed -i 's/\(\t.*echo "Install shared library".*\)/\1\n\t@mkdir $\(inst_path\)/' makefile
sed -i 's/\(\t.*\)\(Dependencies.*\)/\1..\/\2\/../' makefile
sed -i 's/\(\t.*ldconfig.*\)/#\1/' makefile

make         SHARED=1 BUILD_TYPE=small
make install SHARED=1 BUILD_TYPE=small \
  prefix=`readlink -f $PWD/../opt`

popd

function main() {
cat <<EOF
#include <stdio.h>
#include <libjson/libjson.h>
int main() {
EOF

cat "libjson/Getting Started/Library Interface/array.htm" |
sed -n '/<pre/,/<\/pre>/p;/<\/pre>/q' |
sed -e 's/&quot;/"/g' |
sed -e 's/<pre.*>//' -e 's/<\/pre>//' -e 's/^/  /'

cat <<EOF
  return 0;
}
EOF
}

main >json.cpp
g++ json.cpp -ljson -I$PWD/opt/include -L$PWD/opt/lib -o json
LD_LIBRARY_PATH=$PWD/opt/lib ./json

anonymous
()

Собираю

g++ json.cpp -o json -ljson

Ты уверен, что библиотека лежит по стандартному пути? Добавь ключ -L

g++ json.cpp -o json -Lpath/to/json/library -ljson
alexku
()

Разобрался.

Проблема в самом libjson

Если собирать как библиотеку, то для того, чтобы был доступным С++ интерфейс нужно закомментировать (!!!) строку

//#define JSON_LIBRARY

в JSONOptions.h и пересобрать. Иначе доступен только С интерфейс.

Кроме того, если не закомментировать

#define JSON_UNICODE

то библиотеку собрать можно, но программу уже нет, из-за несовместимости обычных и длинных строк.

zhouck
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.