我在这方面遇到了一些问题:我需要为一个C++库编写一个C包装器。假设我有3个文件:
``` 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`。我该如何调试(或者说我做错了什么)?
wrapper.h
typedef struct Foo Foo; Foo* create_foo();
wrapper.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`。我该如何调试(或者说我做错了什么)?
clang++ 'pkg-config --libs --cflags dependent-lib' -std=c++14 wrapper.cpp foo.h wrapper.h -shared -fPIC
(我替换了反引号)使用包装器的程序是由编程语言编译和链接的,错误是@ cc。 - Zihemu