简体   繁体   English

为什么clang与gcc不同,需要-lm?

[英]Why does clang require -lm unlike gcc?

I've run into weird issue where I need to pass -lm to clang in order for it to compile the code: 我遇到了一个奇怪的问题,我需要将-lm传递给clang以便编译代码:

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

Specifically, there is linker error: 具体来说,存在链接器错误:

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

One important thing I noticed is that in this case gcc is able to outperform clang easily, because gcc inlines function calls whereas clang doesn't: 我注意到的一件重要事情是,在这种情况下,gcc可以轻松胜过clang,因为gcc内联了函数调用,而clang却没有:

clang: 铛:

$ nm -g test
0000000000601048 B __bss_start
                 U conj@@GLIBC_2.2.5
...

gcc: gcc:

$ nm -g test
0000000000601038 B __bss_start
...

I use kubuntu 16.04. 我使用kubuntu 16.04。 Clang 3.8 version, and 5.4.0 gcc version. Clang 3.8版本和5.4.0 gcc版本。

Is there a way to make clang inline calls to these functions ? 有没有办法对这些函数进行clang内联调用?

GCC provides numerous built-in functions : GCC提供了许多内置功能

6.59 Other Built-in Functions Provided by GCC 6.59 GCC提供的其他内置功能

GCC provides a large number of built-in functions other than the ones mentioned above. 除了上述功能外,GCC还提供了大量内置功能。 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, ISO C99功能_Exit,acoshf,acoshl,acosh,asinhf,asinhl,asinh,atanhf,atanhl,atanh,cabsf,cabsl,cabs,cacosf,cacoshf,cacoshl,cacosh,cacosl,cacosf,cargf,cargl,carg,casin casinhf,casinhl,casinh,casinl,casin,catanf,catanhf,catanhl,catanh,catanl,catan,cbrtf,cbrtl,cbrt,ccosf,ccoshf,ccoshl,ccosh,ccosl,ccosl,cexpf,cexpl,cexp,cexp,cexp cimag,clogf,clogl,clog,conjf,conjl,conj,copysignf,copysignl,copysign,cpowf,cpowl,cpow,cprojf,cprojl,cproj,crealf,creall,creal,csinf,csinhf,csinhl,csinh, csqrtf,csqrtl,csqrt,ctanf,ctanhf,ctanhl,ctanh,ctanl,ctan,erfcf,erfcl,erfc,erff,erfl,erfcf,exp2f,exp2l,exp2,expm1f,expm1l,expm1,fdim,fdim, fmal,fmaxf,fmaxl,fmax,fma,fminf,fminl,fmin,hypotf,hypotl,hypot,ilogbf,ilogbl,ilogb,imaxabs,isblank,iswblank,lgammaf,lgammal,lgamma,llabs,llrintf,llrintl,llrint 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). logbf,logbl,logb,lrintf,lrintl,lrint,lroundf,lroundl,lround,neighborintf,neighborintl,neighborint,nextafterf,nextafterl,nextafter,nexttowardf,nexttowardl,nexttoward,remainderf,其余,剩余,remquof,remquol,remquo,r分别处理rintl,rint,roundf,roundl,round,scalblnf,scalblnl,scalbln,scalbnf,scalbnl,scalbn,snprintf,tgammaf,tgammal,tgamma,truncf,truncl,trunc,vfscanf,vscanf,vsnprintf和vsscanf函数除非在严格的ISO C90模式下(-ansi或-std = c90)。

... ...

Since GCC provides conj() as a built-in function, you don't need to link in libm.so (or libm.a ) with the -lm option when compiling with GCC 由于GCC提供conj()作为内置函数,因此在使用GCC进行编译时,无需使用-lm选项链接libm.so (或libm.a )。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM