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; )