Complier pkread.c sous linux (opensuse)

onpise Messages postés 2 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 21 septembre 2009 - 19 sept. 2009 à 15:43
onpise Messages postés 2 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 21 septembre 2009 - 21 sept. 2009 à 10:17
Bonjour,

Openssl fourni des programmes demos dont pkread.c fait parti. J'ai utilisé le gestionnaire d'installation de opensuse pour installer openssl. Après l'installation j'ai contrôlé que les fichiers des "include" existe bien. Ils sont dans /usr/include/openssl. J'ai essayé de compiler le programme avec les commandes :

gcc pkread.c -B /usr/include /tmp/ccagAhiE.o: In function `main':

pkread.c:(.text+0x43): undefined reference to `OPENSSL_add_all_algorithms_noconf'
pkread.c:(.text+0x48): undefined reference to `ERR_load_crypto_strings'
pkread.c:(.text+0xa1): undefined reference to `d2i_PKCS12_fp'
pkread.c:(.text+0xdc): undefined reference to `ERR_print_errors_fp'
pkread.c:(.text+0x109): undefined reference to `PKCS12_parse'
pkread.c:(.text+0x134): undefined reference to `ERR_print_errors_fp'
pkread.c:(.text+0x147): undefined reference to `PKCS12_free'
pkread.c:(.text+0x1de): undefined reference to `PEM_write_PrivateKey'
pkread.c:(.text+0x20c): undefined reference to `PEM_write_X509_AUX'
pkread.c:(.text+0x21e): undefined reference to `sk_num'
pkread.c:(.text+0x24f): undefined reference to `sk_value'
pkread.c:(.text+0x25b): undefined reference to `PEM_write_X509_AUX'
pkread.c:(.text+0x268): undefined reference to `sk_num'
collect2: ld returned 1 exit status

gcc pkread.c -B /usr/include/openssl

/tmp/ccENU53D.o: In function `main':
pkread.c:(.text+0x43): undefined reference to `OPENSSL_add_all_algorithms_noconf'
pkread.c:(.text+0x48): undefined reference to `ERR_load_crypto_strings'
pkread.c:(.text+0xa1): undefined reference to `d2i_PKCS12_fp'
pkread.c:(.text+0xdc): undefined reference to `ERR_print_errors_fp'
pkread.c:(.text+0x109): undefined reference to `PKCS12_parse'
pkread.c:(.text+0x134): undefined reference to `ERR_print_errors_fp'
pkread.c:(.text+0x147): undefined reference to `PKCS12_free'
pkread.c:(.text+0x1de): undefined reference to `PEM_write_PrivateKey'
pkread.c:(.text+0x20c): undefined reference to `PEM_write_X509_AUX'
pkread.c:(.text+0x21e): undefined reference to `sk_num'
pkread.c:(.text+0x24f): undefined reference to `sk_value'
pkread.c:(.text+0x25b): undefined reference to `PEM_write_X509_AUX'
pkread.c:(.text+0x268): undefined reference to `sk_num'
collect2: ld returned 1 exit status 


/* pkread.c */

#include <stdio.h>
#include <stdlib.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>

/* Simple PKCS#12 file reader */

int main(int argc, char **argv)
{
FILE *fp;
EVP_PKEY *pkey;
X509 *cert;
STACK_OF(X509) *ca = NULL;
PKCS12 *p12;
int i;
if (argc != 4) {
fprintf(stderr, "Usage: pkread p12file password opfile\n");
exit (1);
}
SSLeay_add_all_algorithms();
ERR_load_crypto_strings();
if (!(fp = fopen(argv[1], "rb"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
exit(1);
}
p12 = d2i_PKCS12_fp(fp, NULL);
fclose (fp);
if (!p12) {
fprintf(stderr, "Error reading PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit (1);
}
if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) {
fprintf(stderr, "Error parsing PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit (1);
}
PKCS12_free(p12);
if (!(fp = fopen(argv[3], "w"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
exit(1);
}
if (pkey) {
fprintf(fp, "***Private Key***\n");
PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL);
}
if (cert) {
fprintf(fp, "***User Certificate***\n");
PEM_write_X509_AUX(fp, cert);
}
if (ca && sk_num(ca)) {
fprintf(fp, "***Other Certificates***\n");
for (i = 0; i < sk_X509_num(ca); i++) 
    PEM_write_X509_AUX(fp, sk_X509_value(ca, i));
}
fclose(fp);
return 0;
}


Il me semble que chaque fois que je dois compiler un programme C avec des libs externe j'ai ce genre de problème. Donc je suis ouvert à toute redirection sur un site qui explique comment résoudre ces problèmes de "undefined référence". Pour information OPENSSL_add_all_algorithms_noconf est déclaré dans un header include par pem.h. Je sais pas si le problème vient de là.

Merci par avance pour votre aide.

2 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
20 sept. 2009 à 18:01
Salut,

Bin c'est pas un problème de compilation, c'est un problème de link.
C'est ultra classique.
Ta librairie est fournit avec un dossier include et un dossier lib.
Le dossier include tu t'en ai servi.
Maintenant, faut te servir du dossier lib, qui contient des .lib ou des .a utilisés au link.

Il faut que tu les mettes en entrée de ton lieur.
0
onpise Messages postés 2 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 21 septembre 2009
21 sept. 2009 à 10:17
Super merci en effet c'était tout simple. Merci de m'y avoir linker :-).
0
Rejoignez-nous