5

AWSラムダ用のネイティブノードモジュールを開発中です。このノードモジュールは必要ですjson-cノードモジュールで静的リンクが機能しない

AWS lambda guidelinesによると、ノードモジュールは動的依存関係を持つべきではありません。そこでjson-cライブラリの静的バージョンをリンクしようとしました。しかし、コンパイル時にエラーが発生しています。ノードモジュールは、単に共有ライブラリであるため

は、私が書いたsample C applicationノードモジュールのコンパイルをシミュレートするために、(メインと改称)、これらは結果である:私がしようとしたとき、「

g++  -shared -pthread -rdynamic -m64 -Wl,-soname=addon.node -o addon.node testjson.cpp -I /usr/include/json-c/ -L /lib/x86_64-linux-gnu/ -l:libjson-c.a 
testjson.cpp: In function ‘int test()’: 
testjson.cpp:6:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 
    char *str = "{ \"msg-type\": [ \"0xdeadbeef\", \"irc log\" ], \ 
      ^
/usr/bin/ld: /tmp/ccihB9d8.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC 
/tmp/ccihB9d8.o: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 

と - 全アーカイブ ":?私が間違っているのは何

g++ -shared -o libshared.so -Wl,--whole-archive -fPIC -l:/usr/lib/x86_64-linux-gnu/libjson-c.a -Wl,--no-whole-archive testjson.cpp -I /usr/include/json-c/ 
testjson.cpp: In function ‘int test()’: 
testjson.cpp:6:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 
    char *str = "{ \"msg-type\": [ \"0xdeadbeef\", \"irc log\" ], \ 
      ^
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libjson-c.a(json_c_version.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC 
/usr/lib/x86_64-linux-gnu/libjson-c.a(json_c_version.o): error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 

静的に共有オブジェクトにライブラリをリンクすることはできませんか?

+0

vanilla Amazon Linux AMIでモジュールを構築しようとしましたか?これはラムダが何を実行しているかのヒントを与えるかもしれません。 – kixorz

答えて

3

まず、静的ライブラリとしてjson-cを手動で構築する必要があります。

JSON-Cの静的Libの

  • wgetのhttps://s3.amazonaws.com/json-c_releases/releases/json-c-0.11.tar.gz
  • タールJSON-C-0.11.tar.gz -xvzf
  • CDのJSON-C-0.11
  • AUTOGENを作成します。
  • ./configure --enable-static --with-pic --prefix =/var/taskです。
  • を作るには、(それがノード-GYPツールを使用してNPMライブラリのソースコードをビルドするために適用可能である)した後、このようなあなたのbinding.gypファイルを設定

をインストールします。

{ 
    "targets": [ 
    { 
     "target_name": "testName", 
     "sources": ["yourCode.c"], 
     "libraries": ["/var/task/lib/libjson-c.a"] 
    } 
    ] 
} 

私のために働いています。

関連する問題