GCC默认链接-l

GCC默认链接-l,gcc,Gcc,例如,当我需要在程序中使用gnu函数gsl_sf_bessel_J0时,我只需使用gcc-lgsl-o gsl_test.c gsl_test编译它。为什么我必须包含-lgsl才能使其工作?是否有任何方法可以将其设置为默认值,这样我就不必每次都键入它?如果使用-v标志编译,您将看到GCC前端调用的命令链接最终的可执行文件*。如果您的程序使用的函数如gsl\u sf\u bessel\u J0不在默认库中(可能限于libc,也可能libm),则需要显式链接它 如果你不喜欢一直键入它,那么制作一个简

例如,当我需要在程序中使用gnu函数gsl_sf_bessel_J0时,我只需使用gcc-lgsl-o gsl_test.c gsl_test编译它。为什么我必须包含-lgsl才能使其工作?是否有任何方法可以将其设置为默认值,这样我就不必每次都键入它?

如果使用
-v
标志编译,您将看到GCC前端调用的命令链接最终的可执行文件*。如果您的程序使用的函数如
gsl\u sf\u bessel\u J0
不在默认库中(可能限于
libc
,也可能
libm
),则需要显式链接它

如果你不喜欢一直键入它,那么制作一个简单的Makefile。您的案例非常简单,只需使用环境变量即可处理,实际上:

$ export CC=gcc
$ export LDLIBS=-lgsl
$ make gsl_test
gcc     gsl_test.c  -lgsl -o gsl_test
$
make
的默认内置规则将完成其余部分

*:作为参考,我的编译器将您的示例链接为:

 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" 
  -demangle 
  -dynamic 
  -arch x86_64 
  -macosx_version_min 10.12.0 
  -o gsl_test 
  /var/folders/cp/wvm69p1n7_bbjpxxqmttwn700000gn/T/gsl_test-0afe3a.o 
  -lgsl 
  -lSystem    
  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.osx.a