繁体   English   中英

C库的C ++包装器作为共享库

[英]C++ Wrapper for C library as shared library

我自己解决了这个问题

问题是图书馆的联系。 我将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;

Makefile文件:

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

所以,我想问题是联系...

这与您标记gcc的顺序有关。

做这个:

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

GCC从左到右读取库和对象,并且(基本上)忽略“还”不需要的任何库和对象。 在我建议的更改中, test.c首先执行,所以GCC知道它将要寻找符号keygen 然后,当它最终看到-Llib/mywrapperlib.so时,将对其进行扫描以查找keygen ,找到它,并知道此库是必需的。

wrapper.cpp的函数签名更改为

extern "C" char* keygen ()

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

我自己解决了这个问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM