2012-05-24 2 views
2

J'ai écrit une fonction de décryptage en utilisant openssl que j'ai testé dans un programme autonome et cela a bien fonctionné. Mais cette fonction fait partie d'un énorme projet et doit donc être incluse dans ce programme. Pour exécuter mon programme autonome j'ai utilisé les commandes suivantes qui a bien fonctionné:Comment lier les fichiers de bibliothèque pour un programme C dans makefile sous UNIX?

cc -c aaa.c -I/usr/local/ssl/include 
gcc -o aaa aaa.o -I/usr/local/ssl/include -L/usr/local/ssl/lib -lcrypto -lm 
./aaa 

J'ai fait un makefile pour mon programme principal à l'intérieur duquel cette fonction sera appelée. Les deux programmes fonctionnent correctement individuellement mais lorsque j'ai inséré la définition sur la fonction dans mon programme, cela m'a donné des erreurs pour les variables qui se trouvaient dans l'un des fichiers d'en-tête de openssl (c'est-à-dire des.h). J'ai fait usage de quelques variables de type DES_cblock:

typedef unsigned char DES_cblock[8]; 

Il y a une autre structure avec la définition suivante:

typedef struct DES_ks 
{ 
    union 
    { 
     DES_cblock cblock; 
     DES_LONG deslong[2]; 
    }ks[16]; 
} DES_key_schedule; 

J'ai fait usage de cette structure dans mon programme comme celui-ci

DES_key_schedule keysched1,keysched2,keysched3; 

Mais il ne reconnaît pas ces variables. Et puisqu'il n'y avait pas une telle erreur quand j'exécutais mon programme autonome, cela signifie que je ne suis pas capable de lier correctement les fichiers de la bibliothèque dans le programme principal. Comment puis-je faire ce travail. Ce sont les erreurs que je reçois:

Syntax error at line 1399, column 16,file/export/home/jayesho/src/custom/FRB/tgl_frbsenddata.ec: 
    Error at line 1399, column 16 in file /export/home/jayesho/src/custom/FRB/tgl_fr 
bsenddata.ec 
    DES_cblock hex_key1,hex_key2,hex_key3,hex_ivec,iv; 
...............1 
PCC-S-02201, Encountered the symbol "hex_key1" when expecting one of the followi 
ng: 
    ; , = : ([ * ? | & < > + -/% .^*= /= %= += -= <<= >>= 
    &&= ||= ^= | & == != <= >= << >> ++ -- -> 
The symbol ";" was substituted for "hex_key1" to continue. 
Syntax error at line 1402, column 22, file /export/home/jayesho/src/custom/FRB/tgl_frbsenddata.ec: 
Error at line 1402, column 22 in file /export/home/jayesho/src/custom/FRB/tgl_fr 
bsenddata.ec 
    DES_key_schedule keysched1,keysched2,keysched3; 
.....................1 
PCC-S-02201, Encountered the symbol "keysched1" when expecting one of the follow 
ing: 
    ; , = : ([ * ? | & < > + -/% .^*= /= %= += -= <<= >>= 
    &&= ||= ^= | & == != <= >= << >> ++ -- -> 
The symbol ";" was substituted for "keysched1" to continue. 
Syntax error at line 1436, column 38, file /export/home/jayesho/src/custom/FRB/tgl_frbsenddata.ec: 
Error at line 1436, column 38 in file /export/home/jayesho/src/custom/FRB/tgl_fr 
bsenddata.ec 
    if (DES_set_key_checked((C_Block *)hex_key1, &keysched1)) 

Maintenant, j'ai juste besoin de lier les fichiers de bibliothèque correctement dans mon programme pour faire courir tout le programme. Le fichier d'en-tête mentionné précédemment est des.h qui fait partie de openssl. J'ai essayé d'inclure la bibliothèque crypto aussi par -lcrypto Auparavant, ce desh n'était pas inclus correctement, mais maintenant j'ai inclus le des.h avec succès sans erreur. Quelqu'un a également suggéré que simplement inclure le fichier d'en-tête ne suffit pas et son fichier d'implémentation doit également être linked, donc je veux maintenant savoir comment inclure et lier quoi? Comment trouver le nom du lien qui doit être lié.

+1

Si cela fonctionne lorsque vous compilez manuellement et non lorsque vous utilisez make, il y a quelque chose d'étrange dans votre Makefile. Qu'y a-t-il dans votre Makefile? –

Répondre

0

Ce sont des erreurs de compilation, vous n'êtes pas encore à l'étape de liaison.

Je suppose que, lors de la compilation de tgl_frbsenddata.ec, le compilateur ne sait pas ce qu'est un DES_cblock ou un DES_key_schedule. Au moment où le compilateur frappe les lignes avec les erreurs, je suppose que des.h n'a pas encore été inclus tout ce que vous pouvez croire à propos de si vous avez ou non.

Votre compilateur inclut probablement une option pour effectuer le pré-traitement seulement (en gcc et clang, c'est -E). Je vous suggère de l'exécuter avec cette option sur votre fichier source pour voir si les typedefs apparaissent.

1

Généralement, vous définissez les options -l pour l'éditeur de liens à l'aide de LDLIBS et les indicateurs -L à l'aide de LDFLAGS. Editez le Makefile et ajoutez les options appropriées.

CPPFLAGS += -I/usr/local/ssl/include 
LDFLAGS += -L/usr/local/ssl/lib 
LDLIBS += -lcrypto -lm 
+1

Ne serait-ce pas "CFLAGS" mais "CPPFLAGS" ici? – alk

+0

@alk CFLAGS sont des indicateurs pour le compilateur C, CPPFLAGS sont des indicateurs pour le préprocesseur. -I drapeaux ne sont utiles que pour le préprocesseur. –

Questions connexes