我已在 mac 10.13.2 上“正确”安装了 gsl。 在我的 C++ 程序中,我像往常一样调用,例如:
#include <gsl/gsl_math.h>
但是运行代码时,找不到gsl。
fatal error: 'gsl/gsl_math.h' file not found
我想知道如何正确链接 gsl PATH 和库。 我试过了,
$gsl-config 返回
/Users/Softwares/HEP_Softwares/Install/Gsl2.3/bin/gsl-config
$pkg-config --libs gsl 返回
-L/Users/Softwares/HEP_Softwares/Install/Gsl2.3/lib -lgsl -lgslcblas -lm
我能找到的唯一解决方案是每次都与 gsl 链接运行。 喜欢:
g++ $(gsl-config --cflags) mycode.cc $(gsl-config --libs) && ./a.out
但我想知道是否可以全局设置 GSL PATH,以便我可以简单地运行
g++ mycode.cc && ./a.out
这就是 C++ 代码的编译和构建方式:
编译
编译单元将获取每个 cpp 文件,并通过包含的标头来查找代码中所用功能的符号签名实现的前向声明。就您而言,这涉及
gsl/gsl.h
。如果在搜索目录中找不到该文件,您可以通过指定 C_INCLUDE_PATH
和/或 CPLUS_INCLUDE_PATH
来展开搜索目录。如果省略 #include <gsl/gsl_math.h>
,您的代码将无法编译,因为存在签名,而您使用的 GSL 函数找不到签名。
链接
编译完所有
cpp/cc
文件后,您需要链接可以执行的二进制文件。链接过程包括搜索 .o/.obj...
文件中的所有符号,并将其与在目标文件和库中找到的符号进行匹配,您已使用例如 -lgsl
指定了这些符号。如果一切顺利,每次查找都会找到适合您机器硬件模型的二进制实现(即 64 位/32 位...、Arm、Intel 等)。如果找不到某些内容,您会发现链接错误。
你问的是,有没有办法让C++不按上面的方式工作?不!
如果您遗漏了
#include <gsl/gsl.h>
或者在您的搜索路径中找不到所述文件,则编译将无法工作。如果省略 -lgsl
,链接将会失败。如果您觉得在命令行中编写上述所有内容很烦人,请编写 Makefile
以将构建过程简化为理想的简单命令:make
。
不要忘记,如果您要链接 GSL 的共享库版本,则可能需要在 Linux 上指定 LD_LIBARAY_PATH,在 Mac 上指定 DYLD_LIBRARY_PATH。
TLDR:你不能要求 C++ 编译器/链接器按照设计以不同的方式工作。