我无法使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;之间的路径一起使用。不确定这是不是之前它没有工作的原因,但它现在就这样工作了。
答案 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"?