3

可能是新手的错误,但是谁能告诉我我在这里做错了什么?
任何帮助深表感谢。

我写了这个简单的 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;
}

谢谢。

4

3 回答 3

2

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

于 2015-04-30T05:14:32.170 回答
0

尝试使用带有选项的 avrogencpp -i < schema_file > -o < header_file >

于 2013-08-15T22:18:03.463 回答
0
  • 下载并编译 Avro c++ 源https://stackoverflow.com/questions/40889705/how-to-compile-apache-avro-c-on-windows(这将生成“ avrogencpp.exe ”)
  • 下载 avro-tools http://avro.apache.org/releases.html#Download,和(安装了java
  • 跑:

    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 --input file.json --output file.hh

于 2016-12-01T16:13:35.770 回答