2

この問題は自分で解決しました

問題はライブラリのリンケージでした。libmywrapper.so(名前を変更した)ファイルを/usr/libにコピーし、-mywrapperとリンクしました:-)

元の投稿:

C コードから C++ 関数を呼び出すことができるラッパー ライブラリを作成しています。残念ながらリンクしていません…

ラッパー.h:

#ifdef __cplusplus
extern "C"
{
#endif
    extern char* (keygen) ();
#ifdef __cplusplus
 }
#endif

ラッパー.cpp:

#include "wrapper.h"
#include <someincludes>
char* keygen ()
{
    urandom u;

メイクファイル:

TARGET      := ./mywrapperlib.so
CXXFLAGS    := -fPIC -shared -g -Wall -std=c++0x -I../someincludes -I.
CXX         := g++
LIB         := -lsomelibs
EXT         := cpp
BUILDDIR    := build

override BUILDDIR := $(strip $(BUILDDIR))
SOURCES  := $(wildcard *.$(EXT))
OBJECTS  := $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES))
DEPS     := $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES))

.PHONY: all
all: $(TARGET)

$(TARGET): $(OBJECTS) $(DEPS)
    $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)

ifneq ($(MAKECMDGOALS), clean)
-include $(DEPS)
endif

$(OBJECTS): $(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(DEPS): $(BUILDDIR)/%.dep: %.$(EXT) $(BUILDDIR)/.tag
    mkdir -p $(dir $(@))
    $(CXX) $(CXXFLAGS) -MM $< -MT $@ -MT $(<:.$(EXT)=.o) -o $@

%.tag:
    mkdir -p $(dir $(@))
    touch $@

.PHONY: clean
clean:
    $(RM) -r $(BUILDDIR)

ライブラリを使用する必要があるテスト ファイル: test.c:

#include <wrapper.h>
int main()
{
    char* test = keygen();
}

でコンパイルしようとすると

gcc  -o test.a -g -Iinclude -Llib/mywrapperlib.so test.c

私は得る

/tmp/ccB9bEot.o: In function `main':
/some/paths/test.c:7: undefined reference to `keygen'

私は、C と C++ のコードを組み合わせたり、ライブラリを作成したりすることに非常に慣れていません。今は立ち往生していて、誰かがこの問題で私を助けてくれることを願っています.

編集:

nmでlibをチェックしました:

nm lib/cryptdbwrapperlib.so | grep keygen
0000000000006935 T keygen

だから、問題はリンケージだと思います...

4

3 に答える 3

1

フラグの順序に関係していますgcc

これを行う:

gcc  -o test.a -g -Iinclude test.c -Llib/mywrapperlib.so
#                           ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
#                           first    second

GCC はライブラリとオブジェクトを左から右に読み取り、(基本的に) 「まだ」必要でないものは無視します。私が提案した変更では、test.c最初に行くので、GCC はシンボルを探していることを認識しkeygenます。次に、最終的に-Llib/mywrapperlib.soそれを確認すると、 をスキャンしてkeygen見つけ、このライブラリが必要であることを認識します。

于 2012-12-14T13:01:08.527 に答える
0

関数のシグネチャをに変更しwrapper.cppます

extern "C" char* keygen ()

それ以外の場合は、C ++スタイル名でコンパイルされるため、ヘッダーで宣言されている関数とは異なる関数になります。

于 2012-12-14T13:37:06.713 に答える
0

この問題は自分で解決しました

問題はライブラリのリンケージでした。libmywrapper.so(名前を変更した)ファイルを/usr/libにコピーし、-mywrapperとリンクしました:-)

于 2012-12-14T15:15:55.233 に答える