2013-02-20 118 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