Pour OpenMP, lorsque mon code utilise les fonctions de son API (par exemple, omp_get_thread_num ()) sans utiliser ses directives (telles que celles #pragma omp ...),
pourquoi spécifier directement libgomp.a à gcc au lieu d'utiliser -fopenmp ne fonctionne pas, comme
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
pdate: Je viens de découvrir que la liaison à libgomp.a ne fonctionne pas, mais que la liaison à libgomp.so fonctionne. Cela signifie-t-il qu'OpenMP ne peut pas être lié statiquement?
Pourquoi -fopenmp ne fonctionne que sans spécifier les fichiers de bibliothèque
gcc hello.c -fopenmp -o hello
pdate: En d'autres termes, lors de l'utilisation de -fopenmp, pourquoi un lien explicite vers libgomp.so n'est pas requis?
Pourquoi cela compile-t-il également:
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
Cela ignorera-t-il les directives OpenMP dans le code s'il y en a?
Merci et salutations!
En général, gardez à l'esprit que les directives et les fonctions sont différentes; les premiers sont contrôlés par -fopenmp
et les seconds sont contrôlés par un lien vers la bibliothèque OpenMP.
(mis à jour pour intégrer les commentaires) Essayez d'utiliser les options -fopenmp
Et -static
Pour lier statiquement OpenMP. Étant donné que cela implique -lgomp -lrt
, La commande suivante ne se compilera pas correctement, sauf si vous spécifiez également l'emplacement de librt.a
.
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
(Mis à jour pour incorporer les commentaires) J'imagine que la commande suivante se compile correctement car la bibliothèque OpenMP est déjà dans votre chemin de bibliothèque et l'éditeur de liens dynamique de votre système se lie automatiquement avec libgomp.so
.
gcc hello.c -fopenmp -o hello
La commande suivante se compile probablement correctement car elle se lie à l'objet partagé pour OpenMP (libgomp.so
). Notez que l'option -static
N'est pas utilisée .
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
Si vous ne spécifiez pas l'option -fopenmp
, Les directives OpenMP doivent être ignorées.