【发布时间】: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