我在Eclipse中有两个C共享库项目,名为“MyLibA”和“MyLibB”:
TestA.h
int Test1(void);
int Test2(void);
TestA.c
#include "TestA.h"
int Test1(void) { return 1; }
int Test2(void) { return 2; }
TestB.h
int Test(void);
TestB.c
#include "TestB.h"
#include "TestA.h"
int Test(void) { return Test1() + Test2(); }
“MyLibA”和“MyLibB”分别产生“libMyLibA.so”和“libMyLibB.so”。
我还有一个C可执行项目“MyExe”:
#include "TestB.h"
int main(void)
{
Test();
return 0;
}
MyExe的属性已设置,因此它知道在哪里可以找到“TestB.h”和“libMyLibB.so”。它还链接到“MyLibB”。
当我编译“MyExe”时,我收到以下错误并发出警告:
错误:
make: *** [MyExe] Error 1
recipe for target `MyExe' failed
警告:
libMyLibA.so, needed by libMyLibB.so, not found (try using -rpath or -rpath-link)
如果我修改了MyExe的属性,它们会消失并且MyExe构建文件,以便它知道在哪里找到“libMyLibA.so”并链接到它但这不是理想的。
例如,如果您使用的依赖于许多其他.so文件的.so文件,那么您必须手动链接到它们。
有办法解决这个问题吗?
答案 0 :(得分:5)
使用-rpath选项。
在Eclipse CDT中,右键单击“MyExe”项目 - >属性 - > C / C ++ Build - >设置 - >工具设置 - > ** C Linker - >其他 - >其他选择
添加
-rpath“libMyLibA.so的路径”
答案 1 :(得分:0)
我在Linux中做过同样的事情(不使用Eclipse,手动通过终端)。工作正常。
应将所有.so文件复制到/ usr / lib位置。如果完成,通过提及库名称本身,将建立链接。
gcc -fPIC -g -c -Wall A.c
gcc -shared -Wl,-soname, -o libMyLibA.so A.o
sudo cp libMyLibA.so /usr/lib
gcc -fPIC -g -c -Wall B.c -lMyLibA
gcc -shared -Wl,-soname, -o libMyLibB.so B.o
sudo cp libMyLibB.so /usr/lib
gcc MyExe.c -lMyLibB -lMyLibA