5

Tôi đang phát triển mô-đun nút gốc cho AWS lambda. Mô-đun nút này cần json-cliên kết tĩnh không hoạt động đối với mô-đun nút

Theo mô-đun AWS lambda guidelines mô-đun nút không được có phụ thuộc động. Vì vậy, hãy thử liên kết phiên bản tĩnh của thư viện json-c. Nhưng tôi nhận được lỗi thời gian biên dịch.

Là một mô-đun nút chỉ là một thư viện chia sẻ, tôi đã viết một sample C application (với chính đổi tên) để mô phỏng biên soạn mô-đun nút và đây là kết quả:

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 

Và khi tôi thử với "- toàn bộ lưu trữ ":

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 

Tôi đang làm gì sai? Không thể liên kết tĩnh một thư viện với một đối tượng được chia sẻ?

+0

Bạn đã thử xây dựng mô-đun của mình trên vanilla Amazon Linux AMI? Điều này có thể cung cấp cho bạn gợi ý về những gì Lambda đang chạy. – kixorz

Trả lời

3

Trước tiên, bạn cần xây dựng json-c theo cách thủ công làm thư viện tĩnh.

Tạo Json-c Static Lib

Sau khi cấu hình tập tin binding.gyp bạn như thế này (nó được áp dụng để xây dựng mã nguồn vào thư viện NPM sử dụng công cụ nút-đầy tớ trường trung học).

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

Làm việc cho tôi.

Các vấn đề liên quan