我正在尝试编译一个使用GSL的程序,实际上我已经能够使用
在我的本地机器上成功编译它了。g++ -o program program.c prog0.o -L/usr/local/lib -lgsl -lgslcblas -lm
我的问题是我需要在共享系统中的工作机器上编译该程序,但我知道程序不会使用最新版本的GSL进行编译,因此我需要安装并使用旧版本。 我使用默认安装在我自己的系统上执行此操作,因此相关文件位于我本地计算机上的/ usr / local / lib中,并且编译对我来说可以使用上述命令。
但是由于工作机器在共享系统中,我不能搞乱默认目录,所以我在/ home / myname / gsl /下的目录中的工作机器上安装了正确的GSL版本。 所以在工作机器上,文件夹/ home / myname / gsl / lib包含与我机器上的文件夹/ usr / local / lib相同的相关文件。
现在我做了各种尝试,试图告诉g ++使用这个自定义安装文件夹,我认为这将归结为
g++ -o program program.c prog0.o -L/home/myname/gsl/lib -lgsl -lgslcblas -lm
但没有成功。无论我做什么,g ++总是使用共享系统上安装的GSL版本,即使只使用
g++ -o program program.c prog0.o
我不久前才开始编程C / C ++并且只知道如何编译程序的基础知识,所以这个链接的东西仍然让我感到困惑。 但据我所知-L / dir /应该告诉g ++在/ dir /和-lgsl -lgslcblas中使用库是它应该在该库中寻找的文件......? 但似乎g ++并不关心我在这里告诉它的库,它似乎总是使用共享工作系统的PATH中的任何东西,它似乎包括我无法使用的这个GSL的最新版本。但我也无法更改PATH,因为我只能访问工作系统上我自己的子目录。 那么如何告诉g ++忽略GSL的默认版本并使用我在/ home / myname / gsl /?手动安装的那个?
答案 0 :(得分:1)
我想出答案,实际上很简单。问题只是我缺乏对外部库的正确使用的理解,并且尝试修复编译命令是错误的方法。
在program.c的代码中,gsl包含在
中#include <gsl/gsl_blas.h>
等等。当然,“&lt;&gt;”直接告诉编译器查看已知的include目录,其中最新的GSL安装在共享系统上。所以使用自定义版本的方式只是改为使用
#include "/home/myname/gsl/lib/gsl_blas.h"
依此类推,直接指定我要使用自定义安装。 然后我用
编译g++ -o program program.c prog0.o /home/myname/gsl/lib/libgsl.so /home/myname/gsl/lib/libgslcblas.so -lm
它成功编译。
(这给我带来了一些其他不明智之处,但至少解决了这个具体问题。)