【问题标题】:How to link and compile using specific library version installed at custom location?如何使用安装在自定义位置的特定库版本链接和编译?
【发布时间】:2017-05-03 19:59:59
【问题描述】:

我正在尝试编译一个使用 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/ 手动安装的版本?

【问题讨论】:

  • g++ 是 C++ 编译器前端,但您的文件使用 .c 通常是 C。正确使用语言,它们是不同的语言!没有语言“C/C++”!
  • 你试过 gcc 吗?
  • @Olaf err.. 我得到提供的 C 程序并且不太喜欢 C 的工件,所以我使用 C++ 来扩展它们并且正在摆脱 C.. 目前仍然两者兼而有之,但只要它有效,我目前有更高的优先级。比如让这个编译工作。
  • @Nguai al 大部分代码都在 C++ 中,所以我怀疑 gcc 是否可以工作
  • 试试这个:-rpath=/home/myname/gsl/lib

标签: compilation linker


【解决方案1】:

我想出了答案,其实很简单。问题只是我对外部库的正确使用缺乏了解,并且尝试修复编译命令是错误的方法。

在program.c的代码中,gsl包含在

#include <gsl/gsl_blas.h>

等等。当然,“”直接告诉编译器在已知的包含目录中查找,共享系统上安装了最新的 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

编译成功。

(这给我带来了一些其他的不明确之处,但至少这个具体问题得到了解决。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2013-11-24
    • 2020-09-01
    • 1970-01-01
    • 2021-02-07
    • 2021-11-11
    相关资源
    最近更新 更多