Bibliothèques statiques et dynamiques

  • Comment créer une bibliothèque partagée xxx.so à partir de _xx1.o et _xx2.o?
    gcc -o xxx.so -shared _xx1.o _xx2.o
  • Comment créer une bibliothèque statique xxx.a à partir de _xx1.o et _xx2.o?
    ar qa _xx1.o _xx2.o
    - Comment retrouver les bibliothèques dynamiques liées à un binaire?
    ldd ./file . La variable d'env $LD_LIBRARY_PATH indique l'emplacement des bibliothèques partagées
    - Comment Générer un index d'une archive?
    ranlib (équivalent à ar -s)
    - Comment Lister les symboles d'un fichier objet?
    nm ./a.out
    - Comment charger de manière dynamique (lors de l'éxécution d'un programme) une librairie externe et utiliser certaines de ses routines?
    Exemple : charge la librairie mathématique, et afficher le cosinus de 2.0
    #include <dlfcn.h> int main(int argc, char **argv) {
             void *handle = dlopen ("/lib/libm.so", RTLD_LAZY);
             double (*cosine)(double) = dlsym(handle, "cos");
             printf ("%f\n", (*cosine)(2.0));
             dlclose(handle);
    }

    La ligne de commande, si le fichier s'appele foo.c
    olly%>gcc -rdynamic -o foo foo.c -ldl

    programmation XML et XSLT en C

  • Xalan-C : Xalan-C++ version 1.0 est une implémentation des "W3C Recommendations for "XSL Transformations (XSLT) and the XML Path Language (XPath)"". Il utilise le parseur XML Xerces-C++ version 1.3.0
  • Xerces-C++ : Parseur XML

  • programmation TCP/IP

    TCP/IP :  Guide to Network Programming Using Internet Sockets

    programmation système

  • Posix threads : POSIX threads explained
  • Programmation multitache
  • IPC System V : Guide to Unix Interprocess Communication
  • RPC (Remote Procedure Call) : Introduction aux RPCs, une profonde introduction aux RPCs pour les programmeurs de systèmes distribués
  • Détecter les fuites de mémoires

    le meilleur outil que j'ai pu trouver est sans conteste mpatrol.
    Pour debugger un programme, il faut inclure #include <mpatrol.h> dans tous les fichiers, puis rajouter -lmpatrol -lbfd -liberty dans les options du linker.
    Ensuite faire : export MPATROL_OPTIONS='LOGALL OFLOWSIZE=8 USEDEBUG'
    Rem : libiberty.so n'étant pas présent sur nombre de systèmes, il peut etre nécessaire de recompiler libmpatrol en integrant libiberty.a. Voici le Makefile que j'ai utilisé (suppose que libiberty.a est dand le repertoire courant).

    Connaitre le temps passé dans chaque fonction

    Dès lors que l'on souhaite réduire le temps d'éxécution d'un programme écrit en C, la question suivante se pose : où se déroulent les calculs les plus lourds?
    L'outil gprof permet de répondre à cette question. Pour l'utiliser, il faut tout d'abord recompiler et linker le source avec l'option -pg, puis éxécuter le programme compilé. Ceci produit le fichier gmon.out, contenant toutes les infos de profiling. Pour obtenir les infos souhaitées, il suffit alors de taper gprof et d'examiner les données affichées (pour plus d'info, taper info gprof sous Unix).

    Divers

  • Comment est-il possible d'utiliser les // de commentaires en C sous IRIX?
    Il faut utiliser le flag -Xcpluscomm (c'est utile pour la programmation PVM lorsque un même programme doit être compilé sous différentes plateformes)
  • Comment générer un nombre aléatoire entre 1 et 10?

  • j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
  • Comment mesurer un temps de calcul en C?
    Plutôt simple, il suffit de prendre deux temps et d'en calculer la différence (en ms ici):
    struct timeb t1,t2;
    ftime(&t1);
    /**
    
     instructions
    
    **/
    ftime(&t2);
    printf("temps = %d\n", (int)((t2.time - t1.time)*1000 + (t2.millitm - t1.millitm)));
    
  • Que signifie le mot-clé "extern" placé devant une déclaration de variable?
    Cela signifie que si fichier1.c définit une variable globale nommée "index" par exemple ( int index; ), alors le fichier2.c doit redéclarer index en tant que variable externe pour pouvoir utiliser "index" ( extern int index; )