在 Idris 中使用共享 C++ 库
Using shared C++ library in Idris
我想 FFI 到来自 Idris 的 third-party C++ 库,但我收到“未定义的符号”。我是 C/C++ 编译的新手。
我通过将 C++ 包装在我从 Idris 调用的纯 C 层中来实现这一点。 C++ 代码作为一堆 .h
header 和一个 .so
共享库提供。目前我只有一个C文件,以后可能会有更多。
这是 C++ 库 header include/foo.h
#include <some/other/library/header.h>
namespace mynamespace {
class Foo {
public:
Foo();
}
}
和 C 包装器 wrapper.cpp
#include <foo.h>
extern "C" {
struct cFoo;
using namespace mynamespace;
struct cFoo* cFoo_new() {
return reinterpret_cast<cFoo*>(new Foo());
}
}
共享库是 lib/libfoo_ext。所以我正在用
编译它们
g++ -shared -Iinclude -Llib -lfoo_ext -o libfoo.so wrapper.cpp
运行没有错误。同时,Idris代码为
module Foo
import System.FFI
export
Foo : Type
Foo = Struct "cFoo" []
%foreign "C:cFoo_new,libfoo"
export
mkFoo : Foo
我正在测试文件中调用 mkFoo
。当我这样做时,我得到
Exception: (while loading libfoo.so) .../build/exec/_tmpchez_app/libfoo.so: undefined symbol: _ZN17mynamespace6FooC1Ev
这个命令:
g++ -shared -Iinclude -Llib -lfoo_ext -o libfoo.so wrapper.cpp
不正确。假设 libfoo_ext
是实现 mynamespace::Foo::Foo()
的第 3 方库,link 命令应该是:
g++ -shared -Iinclude -Llib -o libfoo.so wrapper.cpp -lfoo_ext
link 行 matters 中的库和源的顺序是错误的。
我想 FFI 到来自 Idris 的 third-party C++ 库,但我收到“未定义的符号”。我是 C/C++ 编译的新手。
我通过将 C++ 包装在我从 Idris 调用的纯 C 层中来实现这一点。 C++ 代码作为一堆 .h
header 和一个 .so
共享库提供。目前我只有一个C文件,以后可能会有更多。
这是 C++ 库 header include/foo.h
#include <some/other/library/header.h>
namespace mynamespace {
class Foo {
public:
Foo();
}
}
和 C 包装器 wrapper.cpp
#include <foo.h>
extern "C" {
struct cFoo;
using namespace mynamespace;
struct cFoo* cFoo_new() {
return reinterpret_cast<cFoo*>(new Foo());
}
}
共享库是 lib/libfoo_ext。所以我正在用
编译它们g++ -shared -Iinclude -Llib -lfoo_ext -o libfoo.so wrapper.cpp
运行没有错误。同时,Idris代码为
module Foo
import System.FFI
export
Foo : Type
Foo = Struct "cFoo" []
%foreign "C:cFoo_new,libfoo"
export
mkFoo : Foo
我正在测试文件中调用 mkFoo
。当我这样做时,我得到
Exception: (while loading libfoo.so) .../build/exec/_tmpchez_app/libfoo.so: undefined symbol: _ZN17mynamespace6FooC1Ev
这个命令:
g++ -shared -Iinclude -Llib -lfoo_ext -o libfoo.so wrapper.cpp
不正确。假设 libfoo_ext
是实现 mynamespace::Foo::Foo()
的第 3 方库,link 命令应该是:
g++ -shared -Iinclude -Llib -o libfoo.so wrapper.cpp -lfoo_ext
link 行 matters 中的库和源的顺序是错误的。