【问题标题】:What are the correct flags for linking to gslcblas libraries when they are not in /usr/local/lib?当 gslcblas 库不在 /usr/local/lib 中时,链接到这些库的正确标志是什么?
【发布时间】:2021-10-26 11:04:20
【问题描述】:

在我的个人笔记本电脑上输入

gcc -std=gnu99 -lm -lgsl -lgslcblas equal_runtimes.c particle_filters.c solvers.c -o equal_runtimes

在终端中编译我的 C 代码并且没有问题。据我所知,这是因为 gsl 标头和库分别位于标准搜索路径 /usr/local/include/usr/local/lib (https://www.gnu.org/software/gsl/doc/html/usage.html)。

但是,当我尝试在标头/库分别位于 /apps/gsl/2.1/include/apps/gsl/2.1/lib 的系统上使用上述命令编译相同的代码时,我收到警告

warning: implicit declaration of function ‘gsl_blas_dgemv’ [-Wimplicit-function-declaration] 

因此,编译器似乎没有链接 gsl 库,因为它假设 gsl_blas_dgemv 是我的函数。为了尝试解决这个问题,我遵循了上面 gnu.org 链接中的指导,我能想到的最好的方法是

gcc -L/apps/gsl/2.1/lib -std=gnu99 -lm -lgsl -lgslcblas equal_runtimes.c particle_filters.c solvers.c -o equal_runtimes

但仍然没有成功。我正在使用的上述语法是否存在问题,或者这里还有什么我遗漏的东西?

【问题讨论】:

  • -L SomePath 告诉 GCC 在哪里查找库文件。要告诉它在哪里查找要包含的标头,请使用-I SomePath。此外,如果您的编译器发出一个关于函数隐式声明的警告,而不是关于无法找到包含在#include 中的头文件的警告,那将是非常奇怪的。有吗?
  • 是的,这就是提供的所有信息;仅关于隐式函数声明。在你所说的后面,我试图通过搜索头文件和库来进行编译,但仍然是同样的警告。
  • 那么您的源代码缺少声明gsl_blas_dgemv 的标头的#include
  • 请注意,命令行参数的顺序很重要,尽管有时比其他的更重要。注意安全:将每个库的-l 选项放在 所有源文件、目标文件和其他依赖它的库之后。在极少数情况下,这可能需要您复制一个或多个 -l 选项,这没关系。

标签: c makefile command-line


【解决方案1】:

从@Eric Potpischil 的cmets 开始,问题是错误的标题<gsl/gsl_cblas.h> 被用于gsl_blas_dgemv,而不是正确的<gsl/gsl_blas.h>。这在我自己的系统上不是问题,因为 blas 库会根据其位置自动找到,而在使用外部系统时并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-06-15
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多