2

我在 Eclipse 中有两个 C 共享库项目,分别称为“MyLibA”和“MyLibB”:

测试A.h

int Test1(void);
int Test2(void);

测试A.c

#include "TestA.h"

int Test1(void) { return 1; }
int Test2(void) { return 2; }

测试B.h

int Test(void);

测试B.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 文件,那么您必须手动链接到它们。

有没有办法解决这个问题?

4

2 回答 2

5

使用 -rpath 选项。

在 Eclipse CDT 中,右键单击“MyExe”项目 -> 属性 -> C/C++ 构建 -> 设置 -> 工具设置 -> ** C 链接器 -> 其他 -> 其他选项

添加

-rpath "libMyLibA.so 的路径"

于 2012-09-13T15:35:04.163 回答
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
于 2012-09-13T12:04:01.787 回答