5

Je développe un module de noeud natif pour AWS lambda. Ce module de noeud est nécessaire json-cLa liaison statique ne fonctionne pas pour le module de noeud

Conformément au AWS lambda guidelines, le module de noeud ne doit pas avoir de dépendances dynamiques. Donc essayé de relier la version statique de la bibliothèque json-c. Mais je reçois des erreurs de compilation.

En tant que module de noeud est juste une bibliothèque partagée, j'ai écrit un sample C application (avec principal renommé) pour simuler la compilation du module de noeud et ce sont les résultats:

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 

Et quand j'ai essayé avec « - archive complète ":

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 

Qu'est-ce que je fais mal? Est-il impossible de lier statiquement une bibliothèque à un objet partagé?

+0

Avez-vous essayé de construire votre module sur Amazon Linux AMI vanille? Cela peut vous donner des indices sur l'exécution de Lambda. – kixorz

Répondre

3

Vous devez d'abord créer manuellement json-c en tant que bibliothèque statique.

Créer JSON-c Static Lib

Après avoir configuré votre fichier binding.gyp comme celui-ci (il est applicable pour la construction de code source à la bibliothèque de NPM en utilisant l'outil nœud-Gyp).

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

Cela fonctionne pour moi.