当gslcblas库不在/usr/local/lib时,正确的链接编译参数是什么?
问题原因与解决方案
核心错误原因
你遇到的警告是编译阶段头文件找不到导致的,和链接阶段的库搜索路径没有关系:
-L参数仅用于告知链接器库文件的搜索路径,解决的是链接阶段找不到.so/.a库文件的问题- 你当前缺失的是告知C预处理器头文件搜索路径的
-I参数,所以编译器找不到gsl_blas_dgemv对应的gsl头文件,才会触发隐式声明警告
正确编译命令
需要同时添加头文件搜索路径和库搜索路径,另外注意链接参数的顺序应该放在源文件之后,避免链接器提前加载库时找不到符号:
gcc -std=gnu99 -I/apps/gsl/2.1/include equal_runtimes.c particle_filters.c solvers.c -o equal_runtimes -L/apps/gsl/2.1/lib -lgsl -lgslcblas -lm
额外注意事项
- 链接参数(
-l开头的库、-L开头的库路径)建议放在所有源文件的尾部,因为gcc的链接器是按顺序加载符号的,如果把库放在源文件前面,链接器会先加载库但还没扫描到源文件里的gsl调用,就会跳过库的符号加载,后续反而报找不到函数的错误 - 如果运行二进制时提示找不到gsl的动态库,需要在运行前添加环境变量:
export LD_LIBRARY_PATH=/apps/gsl/2.1/lib:$LD_LIBRARY_PATH
内容的提问来源于stack exchange,提问作者Dan Burrows
相关产品推荐
相关产品推荐

