makefile — Как скомпилировать пример Apache Avro C ++

Возможно, это ошибка новичка, но кто-нибудь может сказать мне, что я здесь не так делаю?
Буду признателен за любую оказанную помощь.

Я написал этот простой Makefile:

CC=g++
INC=-I/usr/local/avro-cpp-1.7.2 -I/usr/local/boost_1_53_0

cpx : generated.cc
$(CC) -o cpx generated.cc $(INC)

Который генерирует эти ошибки:

g++ -o cpx generated.cc -I/usr/local/avro-cpp-1.7.2 -I/usr/local/boost_1_53_0
/tmp/ccYymUVo.o: In function `main':
generated.cc:(.text+0x84): undefined reference to `avro::memoryOutputStream(unsigned long)'
generated.cc:(.text+0xb0): undefined reference to `avro::binaryEncoder()'
generated.cc:(.text+0x11e): undefined reference to `avro::memoryInputStream(avro::OutputStream const&)'
generated.cc:(.text+0x150): undefined reference to `avro::binaryDecoder()'
collect2: ld returned 1 exit status
make: *** [cpx] Error 1

Вот источник в каталоге примеров Avro:

#############################
# cpx.hh
#############################
#ifndef CPX_HH_1278398428__H_
#define CPX_HH_1278398428__H_

#include "boost/any.hpp"#include "avro/Specific.hh"#include "avro/Encoder.hh"#include "avro/Decoder.hh"
namespace c {
struct cpx {
double re;
double im;
};

}
namespace avro {
template<> struct codec_traits<c::cpx> {
static void encode(Encoder& e, const c::cpx& v) {
avro::encode(e, v.re);
avro::encode(e, v.im);
}
static void decode(Decoder& d, c::cpx& v) {
avro::decode(d, v.re);
avro::decode(d, v.im);
}
};

}
#endif

а также

#############################
# generated.cc
#############################
#include "cpx.hh"#include "avro/Encoder.hh"#include "avro/Decoder.hh"
int
main()
{
std::auto_ptr<avro::OutputStream> out = avro::memoryOutputStream();
avro::EncoderPtr e = avro::binaryEncoder();
e->init(*out);
c::cpx c1;
c1.re = 1.0;
c1.im = 2.13;
avro::encode(*e, c1);

std::auto_ptr<avro::InputStream> in = avro::memoryInputStream(*out);
avro::DecoderPtr d = avro::binaryDecoder();
d->init(*in);

c::cpx c2;
avro::decode(*d, c2);
std::cout << '(' << c2.re << ", " << c2.im << ')' << std::endl;
return 0;
}

Благодарю.

3

Решение

Попробуйте использовать avrogencpp с опциями -i < schema_file> -o < header_file>

0

Другие решения

1)

в своем выводе вы не ссылаетесь на библиотеку avrocpp, хотя ваши комментарии о LD_LIBRARY_PATH предполагают, что вы получили ссылку на работу, но программа-пример не смогла найти библиотеку при выполнении. Ваша строка компиляции нуждается в опции компоновщика: -l avrocpp

2)

Если библиотека avrocpp .so не установлена ​​в пути, по которому ваш компоновщик времени выполнения настроен для поиска, вы можете добавить путь к библиотеке в двоичный файл с помощью опции компоновщика -rpath,

Пример 1. Предполагается, что ваша библиотека avrocpp установлена ​​в / usr / local / lib (т.е. /usr/local/lib/libavrocpp.so), а компоновщик времени выполнения не ищет в / usr / local / lib, добавьте rpath добавив эту опцию в командную строку вашего компилятора:

-Wl,-rpath,/usr/local/lib

Пример 2. Предполагая, что ваша библиотека avrocpp установлена ​​в /usr/local/avro-cpp-1.7.2/lib (т.е. /usr/local/avro-cpp-1.7.2/lib/libavrocpp.so), добавьте rpath добавив эту опцию в командную строку вашего компилятора:

-Wl,-rpath,/usr/local/avro-cpp-1.7.2/lib

1

  • Загрузите и скомпилируйте исходники Avro c ++ https://stackoverflow.com/questions/40889705/how-to-compile-apache-avro-c-on-windows (это сгенерирует «avrogencpp.exe«)
  • Скачать авро-инструменты http://avro.apache.org/releases.html#Download, и с Джава установлены)
  • бежать:

    java -jar avro-tools-1.8.1.jar idl file.avdl > file.json

  • Отредактируйте сгенерированный файл JSON и удалите следующее

    1. Если в начале у вас есть строки, предшествующие требуемым структурам, удалите их. (У меня был «протокол»: «файл«,» пространство имен «:»some_optional_namespace«,»типы🙂
    2. Сообщения запись (внизу)
  • Если у вас есть несколько структур, определенных в одном и том же файле json, окружите их всеми «[]«(Вы должны иметь запятые между различными структурами и убедиться, что последняя структура не обработана с помощью»,«

  • Бежать
    avrogencpp.exe -p — -n some_optional_namespace -U — вход file.json —выход file.hh

0