用于C库的C ++ Wrapper作为共享库

时间:2012-12-14 12:54:21

标签: c++ c wrapper

我是由MYSELF解决了这个问题

问题在于图书馆的联系。 我将libmywrapper.so(我重命名)文件复制到/ usr / lib并与-mywrapper链接 就是这样: - )

原帖:

我正在编写一个包装库,允许用C代码调用C ++函数。 不幸的是它没有联系......

wrapper.h:

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

wrapper.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&amp ;; C ++代码和编写库。 现在我卡住了,希望有人可以帮我解决这个问题。

编辑:

我用nm检查了lib:

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

所以,我猜这个问题就是联系......

3 个答案:

答案 0 :(得分:1)

这与你的旗帜顺序为gcc

这样做:

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

GCC从左到右读取库和对象,并且(基本上)忽略任何“尚未”需要的东西。根据我提议的更改,test.c首先发布,因此GCC知道它将寻找符号keygen;然后,当它最终看到-Llib/mywrapperlib.so时,它会扫描keygen,找到它,并且知道这个库是必需的。

答案 1 :(得分:0)

wrapper.cpp中的功能签名更改为

extern "C" char* keygen ()

否则它将使用C ++样式名称进行编译,因此与标题中声明的函数不同。

答案 2 :(得分:0)

我是由MYSELF解决了这个问题

问题在于图书馆的联系。我将libmywrapper.so(我重命名)文件复制到/ usr / lib并与-mywrapper链接就是这样: - )