Skip to content

"ERROR: LoadError: No appropriate factory for type v" on for clang compiler #475

Description

@Gobutah

On my system this bash script

cat << EOF > meson.build
project('CxxWrap', 'cpp',
version : '0.1',
default_options : ['warning_level=3', 'cpp_std=c++17'])

compiler = meson.get_compiler('cpp')
##############################
# CxxWrap dirs
##############################
r = run_command('julia','--project', '-e', 'using CxxWrap; print(CxxWrap.prefix_path())')
assert(r.returncode()==0, 'Cannot get CxxWrap path')
cxxwrap_libdir = r.stdout()+'/lib'
cxxwrap_incdir = r.stdout()+'/include'
lib_cxxwrap = compiler.find_library('cxxwrap_julia', dirs : [cxxwrap_libdir])

##############################
# julia dirs
##############################
r = run_command('julia', '-e', 'print(Sys.BINDIR[1:end-4])')
assert(r.returncode()==0, 'Cannot get Julia lib path')
julia_libdir = r.stdout()+'/lib'
julia_incdir = r.stdout()+'/include/julia'
lib_julia = compiler.find_library('julia',
               dirs : [julia_libdir])

lib = shared_library( 'demo', ['libdemo.cpp'],
  include_directories: [ cxxwrap_incdir, julia_incdir ],
  dependencies: [lib_cxxwrap,lib_julia],
  cpp_args : '-DJULIA_ENABLE_THREADING')
EOF

cat << EOF > libdemo.cpp
#include "jlcxx/array.hpp"
#include "jlcxx/module.hpp"

struct Demo {
  Demo(){};
  jlcxx::Array<int> test() const {
    jlcxx::Array<int> jres;
    jres.push_back(0);
    return jres;
  }
};

JLCXX_MODULE define_julia_module(jlcxx::Module &mod) {
  mod.add_type<Demo>("Demo").method("test", &Demo::test);
}
EOF

cat << EOF > demo.jl
module M
using CxxWrap
@wrapmodule(() -> joinpath("build/libdemo.so"),:define_julia_module)
export Demo
export test
end
using Main.M
d=Demo()
M.test(d)
EOF


CXX=clang++ meson setup build
cd build
ninja
cd ..
julia demo.jl

produces the following output:

The Meson build system
Version: 0.61.2
Source dir: /home/user/tmp
Build dir: /home/user/tmp/build
Build type: native build
Project name: CxxWrap
Project version: 0.1
C++ compiler for the host machine: clang++ (clang 14.0.0-1ubuntu1 "Ubuntu clang version 14.0.0-1ubuntu1.1")
C++ linker for the host machine: clang++ ld.bfd 2.38
Host machine cpu family: x86_64
Host machine cpu: x86_64
WARNING: You should add the boolean check kwarg to the run_command call.
         It currently defaults to false,
         but it will default to true in future releases of meson.
         See also: https://github.com/mesonbuild/meson/issues/9300
Library cxxwrap_julia found: YES
Library julia found: YES
Build targets in project: 1

Found ninja-1.10.1 at /usr/bin/ninja
[1/2] Compiling C++ object libdemo.so.p/libdemo.cpp.o
In file included from ../libdemo.cpp:2:
/home/user/.julia/artifacts/7b2099c0a944e2b2d7f7ca3254c9681a9bf579a0/include/jlcxx/module.hpp:1205:16: warning: unused variable 'is_abstract' [-Wunused-variable]
    const bool is_abstract = jl_is_abstracttype(m_dt);
               ^
/home/user/.julia/artifacts/7b2099c0a944e2b2d7f7ca3254c9681a9bf579a0/include/jlcxx/module.hpp:753:23: warning: lambda capture 'this' is not used [-Wunused-lambda-capture]
      method("copy", [this](const T& other)
                      ^
/home/user/.julia/artifacts/7b2099c0a944e2b2d7f7ca3254c9681a9bf579a0/include/jlcxx/module.hpp:1324:5: note: in instantiation of function template specialization 'jlcxx::Module::add_copy_constructor<Demo>' requested here
    add_copy_constructor<T>(base_dt);
    ^
/home/user/.julia/artifacts/7b2099c0a944e2b2d7f7ca3254c9681a9bf579a0/include/jlcxx/module.hpp:1341:10: note: in instantiation of function template specialization 'jlcxx::Module::add_type_internal<Demo, jlcxx::ParameterList<>, _jl_datatype_t>' requested here
  return add_type_internal<T, SuperParametersT>(name, super);
         ^
../libdemo.cpp:14:7: note: in instantiation of function template specialization 'jlcxx::Module::add_type<Demo, jlcxx::ParameterList<>, _jl_datatype_t>' requested here
  mod.add_type<Demo>("Demo").method("test", &Demo::test);
      ^
2 warnings generated.
[2/2] Linking target libdemo.so
C++ exception while wrapping module M: No appropriate factory for type v
ERROR: LoadError: No appropriate factory for type v
Stacktrace:
 [1] register_julia_module
   @ ~/.julia/packages/CxxWrap/I0P2E/src/CxxWrap.jl:432 [inlined]
 [2] readmodule(so_path_cb::Main.M.var"#1#2", funcname::Symbol, m::Module, flags::Nothing)
   @ CxxWrap.CxxWrapCore ~/.julia/packages/CxxWrap/I0P2E/src/CxxWrap.jl:825
 [3] wrapmodule(so_path_cb::Function, funcname::Symbol, m::Module, flags::Nothing)
   @ CxxWrap.CxxWrapCore ~/.julia/packages/CxxWrap/I0P2E/src/CxxWrap.jl:835
in expression starting at /home/user/tmp/demo.jl:1

C++ compiler for the host machine: clang++ (clang 14.0.0-1ubuntu1 "Ubuntu clang version 14.0.0-1ubuntu1.1")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions