编辑:找到答案。忽略
很抱歉提出这个问题,即使它被问了很多次,但我已经检查了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:
prog.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目录是正确的。
我不确定我的头文件中是否需要某种命名空间/作用域但我还没有看到需要的示例......
非常感谢任何帮助。
谢谢, -Julian
答案 0 :(得分:3)