A library can be shadowed by an internal module name: $ cat >dune-project < (lang dune 2.8) > EOF $ mkdir lib0 lib1 lib2 $ cat >lib0/dune < (library > (name lib0)) > EOF $ cat >lib0/lib0.ml < let greeting_from_lib0 = "Hello World" > EOF $ cat >lib1/dune < (library > (name lib1)) > EOF $ cat >lib1/lib1.ml < let greeting = "Hello World" > EOF $ cat >lib2/dune < (library > (libraries lib1) > (name lib2)) > EOF Now we shadow lib1: $ cat >lib2/lib1.ml < let greeting = () > EOF $ cat >lib2/lib2.ml < print_endline Lib1.greeting > EOF $ dune build @all File "lib2/lib2.ml", line 1, characters 14-27: 1 | print_endline Lib1.greeting ^^^^^^^^^^^^^ Error: The value Lib1.greeting has type unit but an expression was expected of type string [1] We can use the rename dependency type to use lib1 with a different name: $ cat >lib2/dune < (library > (libraries lib1 unix) > (root_module root) > (name lib2)) > EOF $ cat >lib2/lib2.ml < module U = UnixLabels > let () = print_endline Root.Lib1.greeting > EOF $ dune build @all The same for executables: $ mkdir exe $ cat >exe/dune < (executable > (name foo) > (libraries lib1) > (root_module root)) > EOF $ echo >exe/lib1.ml < let greeting = () > EOF $ cat >exe/foo.ml < print_endline Root.Lib1.greeting > EOF $ dune exec ./exe/foo.exe Hello World