繁体   English   中英

在 Idris 中使用共享 C++ 库

[英]Using shared C++ library in Idris

我想 FFI 到 Idris 的第三方 C++ 库,但我得到“未定义的符号”。 我是 C/C++ 编译的新手。

我通过将 C++ 包装在我从 Idris 调用的纯 C 层中来做到这一点。 C++ 代码作为一组.h头文件和一个.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.so 我正在编译这些

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 方库,则链接命令应为:

g++ -shared -Iinclude -Llib -o libfoo.so wrapper.cpp -lfoo_ext 

链接行上的库和来源的顺序很重要,你的顺序是错误的。

暂无
暂无

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

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