我遇到了一个奇怪的问题,我需要将-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;
}
具体来说,存在链接器错误:
/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)
我注意到的一件重要事情是,在这种情况下,gcc能够轻松胜过clang,因为gcc内联函数调用而clang不会:
铛:
$ nm -g test
0000000000601048 B __bss_start
U conj@@GLIBC_2.2.5
...
GCC
$ nm -g test
0000000000601038 B __bss_start
...
我使用kubuntu 16.04。 Clang 3.8版本和5.4.0 gcc版本。
有没有办法对这些函数进行clang内联调用?
答案 0 :(得分:4)
GCC provides numerous built-in functions:
6.59 GCC提供的其他内置功能
GCC提供了大量的内置功能 上文提到的。其中一些是供处理内部使用的 例外或可变长度的参数列表,并没有记录 在这里,因为他们可能会不时改变;我们不推荐 一般使用这些功能。
提供其余功能以进行优化。
...
ISO C99功能_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, 余下,remquof,remquol,remquo,rintf,rintl,rint,roundf, 圆形,圆形,scalblnf,scalblnl,scalbln,scalbnf,scalbnl,scalbn, snprintf,tgammaf,tgammal,tgamma,truncf,truncl,trunc,vfscanf, vscanf,vsnprintf和vsscanf作为内置函数处理,除了 在严格的ISO C90模式下(-ansi或-std = c90)。
...
由于GCC提供conj()
作为内置功能,因此您无需在libm.so
(或libm.a
)中使用-lm
选项进行链接用GCC编译