2013-02-20 116 views
2

可能是一个新手错误,但任何人都可以告诉我在这里做错了什么?
任何帮助,非常感谢。如何编译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; 
} 

谢谢。

+2

这些都是链接错误。可能需要添加一些-l选项来告诉gcc库文件包含Avro函数,并且可能还有一个-L选项以及该文件所在的目录。 – rici 2013-02-20 22:42:07

+2

谢谢。我尝试了各种方法来识别图书馆。最后,设置LD_LIBRARY_PATH有窍门。我想我有更多的阅读要做。谢谢。 – user2093191 2013-02-21 13:25:31

回答

0

尝试使用av​​rogencpp与选项-i < schema_file> -o < header_file>

+0

对不起 - 只是意识到我应该检查接受按钮。另外,谢谢。请原谅我的迟到。 – user2093191 2014-12-23 19:02:44

1

1)

在输出

,你不链接对avrocpp库中,虽然你对LD_LIBRARY_PATH意见建议您有链接工作,但示例程序在执行时未能找到该库。你的编译行需要链接器选项:-l avrocpp

2)

。所以如果没有安装在你的运行时链接程序配置为搜索路径avrocpp库,你可以添加库路径到二进制文件本身连接器选项-rpath。示例1:假设您的avrocpp库安装在/ usr/local/lib(例如/usr/local/lib/libavrocpp.so)中,并且您的运行时链接程序不在/ usr/local/lib中查看,

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

实施例2:通过加入此选项可将编译器命令行添加rpath假设你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

0
  • 下载并编译阿夫罗C++源https://stackoverflow.com/questions/40889705/how-to-compile-apache-avro-c-on-windows(这将产生 “avrogencpp.exe”)
  • 下载阿夫罗工具http://avro.apache.org/releases.html#Download,以及(与的java安装
  • 运行:

    Java的罐子Avro的工具-1.8.1.jar IDL file.avdl>文件。JSON

  • 编辑生成的JSON文件并删除以下

    1. 如果你之前在一开始所需要的结构的任何行,删除它们。 (我有 “协议”: “文件”, “命名空间”: “some_optional_namespace”, “类型” :)
    2. 消息条目(底部)
  • 如果你在同一个json文件中定义了多个结构体,将它们全部用“[]”(你应该在不同的结构体之间有逗号并确保最后一个结构体没有进行“,

  • 运行 avrogencpp.exe -p - -n some_optional_namespace -U --input file.json --output file.hh

+0

为什么不显示您所做的实际代码更改而不是描述它们? – user2672165 2016-12-02 18:28:57

+0

没有代码更改,只有一些json文件编辑 – radato 2016-12-04 09:54:48

+0

好的。没什么重要的。 – user2672165 2016-12-04 11:55:14