编辑:找到答案。忽视
很抱歉问这个问题,尽管它被问了很多次,但我已经检查了 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 目录是正确的。
我不确定我的头文件中是否需要某种命名空间/范围,但我还没有看到示例需要...
任何帮助将不胜感激。
谢谢,-朱利安