【发布时间】:2015-11-01 09:22:13
【问题描述】:
我遇到了一些问题:我需要为 C++ 库编写 C 包装器。假设我有 3 个文件:
-
包装器.h
typedef struct Foo Foo; Foo* create_foo(); -
包装器.cpp
extern "C" { #include "wrapper.h" } #include "foo.h" Foo* create_foo() { return new Foo; } -
foo.h
class Foo { public: Foo(); };
这编译得很好:
clang++ -std=c++14 wrapper.cpp foo.h wrapper.h -shared -fPIC
clang++ -shared -o libbindings.so a.out
但是在编译使用 C 包装器的程序(它是编译器并通过使用包装器的编程语言 - Crystal 链接)时,我得到一个对 create_foo() 的未定义引用和一个链接器错误 collect2: error: ld returned 1 exit status。我该如何调试(以及我做错了什么)?
【问题讨论】:
-
您告诉链接器通过指定选项
-lshared_library_providing_create_foo链接到libshared_library_providing_create_foo.so? -
显示您的
wrapper.h(假设这是 C 程序包含的内容)。 -
@alk 是的,我将 so 目录添加到 LD_LIBRARY_PATH。
-
@melpomene 和我描述的完全一样,只有 typedef 和函数声明
-
@DavidHaim Err....?无论好坏,C 都是为低级代码接口建立的“通用语言”。您提出的替代方案是什么?