2017-08-03 2 views
1

J'ai couru en question bizarre où je dois passer -lm à clang pour qu'il compiler le code:Pourquoi clang nécessite -lm contrairement à gcc?

gcc test.c -o test  #works 
clang test.c -o test  #doesn't work 
clang -lm test.c -o test #works 


#include <stdio.h> 
#include <complex.h> 

int main() { 
    double complex z = 1.0 + 3.0 * I; 
    double complex conjugate = conj(z); 
    printf("The conjugate of Z is = %.2f %+.2fi\n", creal(conjugate), cimag(conjugate)); 
    return 0; 
} 

Plus précisément, il y a erreur de liens:

/tmp/test-561678.o: In function `main': 
test.c:(.text+0x4a): undefined reference to `conj' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

important chose que je remarque est que dans ce cas gcc est capable de surpasser clang facilement, car inline gcc fonction des appels alors que clang ne:

clang:

$ nm -g test 
0000000000601048 B __bss_start 
       U [email protected]@GLIBC_2.2.5 
... 

gcc:

$ nm -g test 
0000000000601038 B __bss_start 
... 

J'utilise Kubuntu 16.04. Version Clang 3.8 et version 5.4.0 gcc.

Existe-t-il un moyen de faire des appels en ligne avec ces fonctions?

+0

Parce qu'ils sont différents compilateurs et ont différentes implémentations des bibliothèques? –

+0

@AjayBrahmakshatriya Ce n'est pas du tout un problème de bibliothèque. C'est une extension de GCC - GCC fournit de nombreuses fonctions intégrées. –

+0

@AndrewHenle par bibliothèque Je ne voulais pas dire les fichiers lib réels (ou si). Je voulais dire que la bibliothèque utilisait des nombres complexes. On l'implémente à travers des builtins, d'autres en utilisant des appels de fonctions. J'ai utilisé des formulations incorrectes. –

Répondre

4

GCC provides numerous built-in functions:

6.59 Other Built-in Functions Provided by GCC

GCC provides a large number of built-in functions other than the ones mentioned above. Some of these are for internal use in the processing of exceptions or variable-length argument lists and are not documented here because they may change from time to time; we do not recommend general use of these functions.

The remaining functions are provided for optimization purposes.

...

The ISO C99 functions _Exit, acoshf, acoshl, acosh, asinhf, asinhl, asinh, atanhf, atanhl, atanh, cabsf, cabsl, cabs, cacosf, cacoshf, cacoshl, cacosh, cacosl, cacos, cargf, cargl, carg, casinf, casinhf, casinhl, casinh, casinl, casin, catanf, catanhf, catanhl, catanh, catanl, catan, cbrtf, cbrtl, cbrt, ccosf, ccoshf, ccoshl, ccosh, ccosl, ccos, cexpf, cexpl, cexp, cimagf, cimagl, cimag, clogf, clogl, clog, conjf, conjl, conj, copysignf, copysignl, copysign, cpowf, cpowl, cpow, cprojf, cprojl, cproj, crealf, creall, creal, csinf, csinhf, csinhl, csinh, csinl, csin, csqrtf, csqrtl, csqrt, ctanf, ctanhf, ctanhl, ctanh, ctanl, ctan, erfcf, erfcl, erfc, erff, erfl, erf, exp2f, exp2l, exp2, expm1f, expm1l, expm1, fdimf, fdiml, fdim, fmaf, fmal, fmaxf, fmaxl, fmax, fma, fminf, fminl, fmin, hypotf, hypotl, hypot, ilogbf, ilogbl, ilogb, imaxabs, isblank, iswblank, lgammaf, lgammal, lgamma, llabs, llrintf, llrintl, llrint, llroundf, llroundl, llround, log1pf, log1pl, log1p, log2f, log2l, log2, logbf, logbl, logb, lrintf, lrintl, lrint, lroundf, lroundl, lround, nearbyintf, nearbyintl, nearbyint, nextafterf, nextafterl, nextafter, nexttowardf, nexttowardl, nexttoward, remainderf, remainderl, remainder, remquof, remquol, remquo, rintf, rintl, rint, roundf, roundl, round, scalblnf, scalblnl, scalbln, scalbnf, scalbnl, scalbn, snprintf, tgammaf, tgammal, tgamma, truncf, truncl, trunc, vfscanf, vscanf, vsnprintf and vsscanf are handled as built-in functions except in strict ISO C90 mode (-ansi or -std=c90).

...

Depuis GCC fournit conj() en fonction intégrée, vous n'avez pas besoin de créer un lien dans libm.so (ou libm.a) avec l'option -lm lors de la compilation avec GCC

+0

Savez-vous comment intégrer ces fonctions? J'utilise intensivement clang et dans mon cas gcc surpasse de nombreux facteurs parce qu'il inline les appels à ces fonctions. – Goovie

+0

@Goovie Voir https://stackoverflow.com/questions/15548023/clang-optimization-levels pour plus d'informations concernant l'optimisation de clang. –

+0

J'ai modifié ce test, recompilé avec "-O3 -flto" sur les deux compilateurs, et n'obtient toujours pas ces fonctions inline en clang, notez qu'aucune passe d'optimisation n'est capable d'aligner ces fonctions car clang n'a pas leur définitions, apparemment si je voulais avoir ces fonctions inline je dois les écrire moi-même. – Goovie