共享库和rpath

时间:2018-02-12 14:54:17

标签: c linux ubuntu gcc

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

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

的main.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 中指定)它不起作用,并且仍然只在指定的路径中搜索库当我编译 main.c 文件时, ../ release / lib / lib_time_mgmt.so

我做错了什么?

编辑:接受答案后,我在这里留下了我使用它的确切行,并让它适用于任何可能发现它有用的人:

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

注意:rpath与simple&#39;之间的路径一起使用。不确定这是不是之前它没有工作的原因,但它现在就这样工作了。

1 个答案:

答案 0 :(得分:2)

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 <...> vs #include "..."的使用值得怀疑。请参阅:What is the difference between #include <filename> and #include "filename"?