gpt4 book ai didi

c - 共享库和 rpath

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:58 26 4
gpt4 key购买 nike

我无法使 rpath 正常工作并使我的二进制文件在指定文件夹中搜索库:

我有 3 个非常简单的文件:

ma​​in.c

#include <stdio.h>
#include <func.h>
int main() {
testing();
return 1;
}

func.h

void testing();

func.c

#include "func.h"
void testing(){

printf(testing\n");
}

然后我继续创建一个共享库,如下所示:

gcc -c -fpic func.c -o ../release/func.o
gcc -shared -o ../release/lib/lib_func.so ../release/func.o

然后编译程序:

gcc main.c ../release/lib/lib_time_mgmt.so -Wl,-rpath=/home/root/ -o ../release/main

我收到下一个警告:

main.c:7:2: warning: implicit declaration of function ‘testing’ [-Wimplicit-function-declaration]
testing();

但除此之外,该程序运行良好。

但是,我的问题是,如果现在我想将库移动到/home/root(如 rpath 中指定的那样),它不起作用并且库仍然只在指定的路径中搜索当我编译 ma​​in.c 文件时,它是 ../release/lib/lib_time_mgmt.so

我做错了什么?


编辑:接受答案后,我将使用它时的确切行留在这里,并使其适用于可能觉得它有用的人:

gcc main.c -L/home/root -Wl,-rpath,'/home/root/' -l:libtime_mgmt -o ${OUT_FILE}

注意:rpath 与简单'.' 之间的路径一起使用。不确定这是否是之前无法正常工作的原因,但现在可以这样工作了。

最佳答案

rpath不在编译时使用,而是在链接/运行时使用...因此您可能需要同时使用这两个:

  • -L /home/root - 在构建时正确链接
  • -Wl,-rpath=/home/root - 在运行时正确链接

您应该使用 -l ${lib}标记与库链接,不要将它们的路径指定为输入。

除此之外,惯例规定库被命名为 libNAME.so - 例如:

  • -l func将尝试与 libfunc.so 链接
  • -l time_mgmt将尝试与 libtime_mgmt.so 链接

一旦您解决了上述问题,请尝试以下操作:

gcc main.c -L/home/root -Wl,-rpath=/home/root -lfunc -ltime_mgmt -o ${OUT_FILE}

最后一点,我建议您尽量不要使用 rpath ,而是专注于在正确的位置安装库。


与您的问题无关,但值得注意。您对 #include <...> 的使用对比#include "..."值得怀疑。请参阅:What is the difference between #include <filename> and #include "filename"?

关于c - 共享库和 rpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48749213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com