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 にリンクさせたいと思います。

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

-lmemfxnsdoesntexist を意図的に呼び出すと、.so が見つからないと不平を言うため、libmemfxns.so を見つけることができると確信しています。-L および -I ディレクトリも正しいと確信しています。

ヘッダー ファイルにある種の名前空間/スコープが必要かどうかはわかりませんが、それが必要な例は見たことがありません...

どんな助けでも大歓迎です。

ありがとう - ジュリアン

4

1 に答える 1

3

うわー、このばかを見てください。彼は、.cpp での命名方法と比較して、ヘッダーで異なる名前のメソッドを持っています。

于 2013-03-18T22:21:13.590 に答える