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

标签 c++ c wrapper

我自己解决了这个问题

问题是库的链接。 我将 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)

应该使用该库的测试文件: 测试.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 检查了库:

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,找到它,并知道需要这个库。

关于C 库的 C++ 包装器作为共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13879107/

相关文章:

c++ - 标准在哪里指定类内定义的函数是内联的?

c - C 中的数组比较和循环

c - 如何从 c 调用 opaque_wrapper 结构?

c++ - clang-format 过度缩进概念

C++ 返回指针与使用 std::move 返回本地对象

C++ 范围-v3 : trying to chain together transforms

java - 用图标包装可执行 jar 文件

c - 如何在C中向后打印一个单词

c - 具有整数增量的 bool 表达式给出意想不到的结果

c++ - 如何在 C++17 中制作模板包装器/装饰器