Unable to import types from another canister. Works for a plain "lib" type

Here is a minimal reproduction

Basically, the issue is I am unable to import from a package that is a canister but can import from a package that contains a normal lib

These lines import from another canister

These lines import from another package in the workspace

The first one doesn’t work, the second one does. Can I not import from one canister package into another? Seems like an arbitrary limitation.

Thoughts?

Hi @saikatdas0790,

Likely, the constraint comes from following config in callee/Cargo.toml:

[lib]
crate-type = ["cdylib"]

This is crucial for building target wasm. But it also make the crate not a rust lib anymore. Then it cannot be depended by other crates.

For data structures to be used by multiple canisters, it’s better to move them into a non-cdylib crate.
And let each canister crate depend on that crate.

This is indeed what you achieved with the utils crate.

Oh well, would have preferred to be able to do that, for the sake of colocating types, but as I read more, I understand this is a Rust limitation, not an IC limitation. :slight_smile:

I updated the code here to make the compiler happy, but the dfx build step still fails.

Basically, I tried 2 things:

  • Removing the crate type
  • Adding “lib” to the “cdylib” for the crate type array

Both of them make the compiler happy but the build fails.

What’s the reason for a canister type to specifically be “cdylib”?

You can definitely import from canisters but you might run into duplicate symbols, e.g. `rust-lld: error: duplicate symbol: canister_query http_request` when trying to use `ic-certified-assets` · Issue #304 · dfinity/cdk-rs · GitHub

So, better not to do it and just define things in a shared lib?

I also had trouble importing from a canister crate marked cdylib. After consulting with Claude I found that one can add rlib to the Cargo.toml in a canister crate like this

image