1

编辑:找到答案。忽视

很抱歉问这个问题,尽管它被问了很多次,但我已经检查了 20 多个类似的问题,但没有一个有帮助。

我创建了一个共享对象,现在在链接到该 .so 的程序中使用它。程序无法链接(ld 错误)。

memfxns.h:

#ifndef MEM_H
#define MEM_H
char* getBuf();
void releaseBuf(char*);
#endif

memfxns.cpp:

#include "memfxns.h"

char* getBuffer()
{
        char* ret_val = new char[4];
        //fill the buffer here
        return ret_val;
}

void releaseBuffer(char* buf)
{
        delete buf;
}

这些家伙被编译成这样以产生一个共享对象(注意我试过没有 -soname 因为它似乎是重复的,但没有成功):

g++ -Wall -fPIC -c ./*.cpp
g++ -shared -Wl,-soname,libmemfxns.so -o ./libmemfxns.so ./*.o

现在我想让我的程序链接到新的.so:

程序.cpp:

#include <stdio.h>
#include "memfxns.h"

int main()
{
        char* buf = getBuf();
        for(int i = 0; i < 4; i++)
                printf("%d\n", buf[i]);
        releaseBuf(buf);

        return 0;
}

我使用以下命令编译:

g++ ./prog.cpp -o prog -I/home/jbu/Desktop/hadooprelated/testjna/so/include -L/home/jbu/Desktop/hadooprelated/testjna/so -lmemfxns
/tmp/ccOR12i1.o: In function `main':
prog.cpp:(.text+0x9): undefined reference to `getBuf()'
prog.cpp:(.text+0x55): undefined reference to `releaseBuf(char*)'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

我相当确定它能够找到 libmemfxns.so,因为当我故意调用 -lmemfxnsdoesntexist 时,它抱怨它找不到 .so。我也确定我的 -L 和 -I 目录是正确的。

我不确定我的头文件中是否需要某种命名空间/范围,但我还没有看到示例需要...

任何帮助将不胜感激。

谢谢,-朱利安

4

1 回答 1

3

哇,看看这个白痴,与在.cpp 中的命名方式相比,他在标题中的方法名称不同。

于 2013-03-18T22:21:13.590 回答