【问题标题】:Where to change LD_LIBRARY_PATH在哪里更改 LD_LIBRARY_PATH
【发布时间】:2019-12-27 09:25:05
【问题描述】:

我想把这些文件编译成可执行文件。

//main.c
#include <stdio.h>
#include <mylib.h>

int main(void){
  call_hello_world();
  return 0;
}
//mylib.h
void call_hello_world(void);
//mylib.c
#include <mylib.h>
#include <stdio.h>

void call_hello_world( void ) {
  printf( ”Hello world!” );
}

我试过了

gcc -c -I. -fPIC -o mylib.o mylib.c 
gcc -shared -o libmylib.so mylib.o
gcc -c -o main.o main.c
gcc -o hello main.o -L. -lmylib

但是在第三步,我被卡住了,因为它找不到我的 'mylib.h'。我的教授说我需要更改 'LD_LIBRARY_PATH' 所以我尝试添加这个 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dev/shm 我的 .zshrc 但它仍然对我不起作用。有什么建议我应该怎么做?

【问题讨论】:

  • 如果你建立一个静态存档,那么你可以gcc -o hello main.o -L. -l:libmylib.a。您不必担心 Linux 路径问题。另一种可能性是gcc -o hello main.o -L. -lmylib -Wl,--enable-new-dtags -Wl,-R,'$ORIGIN/.'。它也将避免 Linux 路径问题,但您需要将库与可执行文件保存在同一目录中。在这两种情况下,您都不需要在LD_LIBRARY_PATH 上浪费时间。

标签: c linux gcc compilation


【解决方案1】:

您的方法存在几个问题。

首先,像 #include &lt;mylib.h&gt; 这样包含头文件和像 #include "mylib.h" 这样包含头文件是有区别的。

第一个选项通常用于包含标准库头文件,根据 Linux 上的FHS,它应该位于标准目录集中。

后者是您可能想要使用的选项,因为它通常用于包含 用户定义的标头,并告诉预处理器在包含该指令的文件的目录中进行搜索。 (参见@quest49 的答案https://stackoverflow.com/a/21594/3852949

LD_LIBRARY_PATH 环境变量用于指示在查看标准目录集之前应首先搜索的位置。

所以你想要做的是让你的main.c 文件编译,并且在将#include &lt;mylib.h&gt; 指令更改为#include "mylib.h" 之后,是:

  • 将包含文件添加到您的main.c文件所在的目录中
  • 使用 gcc 的 -I 选项指示包含文件路径的位置

【讨论】:

  • 感谢您发现我的错误并告诉我如何解决它!
【解决方案2】:

这些是需要的命令:

gcc -c -I. -fPIC -o mylib.o mylib.c
gcc -shared -o libmylib.so mylib.o
gcc -c -I. -o main.o main.c
gcc -o hello main.o libmylib.so

然后在你的外壳中:

导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/full/path/of/directory/包含/libmylib-so

【讨论】:

  • 谢谢!这是我错过的-I.
  • LD_LIBRARY_PATH 包含搜索动态库的目录。你能接受解决方案吗?
猜你喜欢
  • 2021-02-27
  • 2015-08-03
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2017-08-19
  • 2015-01-23
相关资源
最近更新 更多