如何在mac上正确设置GSL路径

时间:2018-01-27 12:22:05

标签: c++ macos path gsl

我正确地'在mac 10.13.2上安装了gsl。 在我的c ++程序中,我像往常一样打电话,例如:

#include <gsl/gsl_math.h>

但是在运行代码时,它无法找到gsl。

fatal error: 'gsl/gsl_math.h' file not found

我想知道如何正确链接gsl PATH和库。 我试过了,

  1. 在.bash_profile
  2. 中设置PATH和LD_LIBRARY_PATH
  3. 将PKG_CONFIG_PATH设置为... / Gsl2.3 / lib / pkgconfig
  4. $ gsl-config返回

    /Users/gkdgoutam/Softwares/HEP_Softwares/Install/Gsl2.3/bin/gsl-config
    

    $ pkg-config --libs gsl返回

    -L/Users/gkdgoutam/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
    

1 个答案:

答案 0 :(得分:0)

这就是编译和构建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 ++编译器/链接器按设计工作方式不同。