Do you have the source code of uiop available in the central registry? Quicklisp won't
download it, because asdf considers it being preloaded. Also, if so, do you have uiop
listed as a dependency?

Alternatively you may add asdf as a dependency to your system.

Regards,
Daniel

--
Daniel Kochmański ;; aka jackdaniel | Przemyśl, Poland
TurtleWare - Daniel Kochmański      | www.turtleware.eu

"Be the change that you wish to see in the world." - Mahatma Gandhi



‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Tuesday, 1 December 2020 22:01, Иван Трусков <trus19@gmail.com> wrote:

Thank you very much. After rebuilding with newer version of ecl and with :init-name supplied compilation was a success.

However, when i try to run the resulting executable, i get this error:

Condition of type: SIMPLE-ERROR
Package ((UIOP/STREAM . #<UIOP/STREAM package>)) referenced in compiled file
  NIL
but has not been created

Available restarts:

1. (IGNORE) Ignore the error, and try the operation again

What should be done in this situation and how can i avoid it? Searching internet with this message did not yield any meaningful results (except for one Stackoverflow post that tells about having the same mistake).

вт, 1 дек. 2020 г. в 22:15, Marius Gerbershagen <marius.gerbershagen@gmail.com>:
The generated library does indeed contain all systems that your library
contains on. The undefined references are init functions, which need to
be called via ecl_init_module after cl_boot to initialize the compiled
libraries (see
https://common-lisp.net/project/ecl/static/manual/System-building.html#Build-it-as-shared-library-and-use-in-C
for more details).

Since you didn't specify an explicit init name yourself, init functions
are automatically generated for each system contained in the final
library. When compiling a monolithic library, it is preferable to
specify an explicit init name yourself, for example as

(asdf:make-build :embedded-console :type :static-library :move-here
#P"/my/output/dir" :monolithic t :init-name "init_lib_embedded_console")

and then invoke it using

extern void init_lib_embedded_console(cl_object);
/* ... */
cl_boot(argc, argv);
ecl_init_module(NULL, init_lib_embedded_console);

Am 29.11.20 um 13:17 schrieb Иван Трусков:
> Hello. I am trying to make a library that makes use of 'STR' package and
> link it into my C program.
> I presumed that using :monolithic t flag would result in the static
> library that contained all systems my library depends on. However it
> seems that is not the case.
>
> Here is my .asd file:
>
> (defsystem "embedded-console"
>    :description "embedded console - ECL functions for smart snake game"
>    :author "Ivan Truskov <trus19@gmail.com <mailto:trus19@gmail.com>>"
>    :components ((:file "embedded-console"))
>    :depends-on ("str"))
>
> I am compiling the library with command:
>
> ecl -norc -eval '(require :ecl-quicklisp)'
>                      -eval '(push \"/my/src/dir/\" asdf:*central-registry*)'
>                      -eval '(asdf:make-build :embedded-console :type
> :static-library :move-here \#P\"/my/output/dir}\" :monolithic t )'
>                      -eval '(quit)'
>
> However, when i try to link with resulting library, this is what i get:
>
> ... undefined reference to `init_lib_CL_PPCRE'
> ... undefined reference to `init_lib_BASE'
> ... undefined reference to `init_lib_CL_UNICODE'
> ... undefined reference to `init_lib_CL_PPCRE_UNICODE'
> ... undefined reference to `init_lib_CL_CHANGE_CASE'
> ... undefined reference to `init_lib_STR'
> ... undefined reference to `init_lib_EMBEDDED_CONSOLE'
>
> And indeed, when i run nm over the built file
> embedded-console--all-systems.a, this is output:
>
> eclinitVtJU9J.o:
> 0000000000000000 b Cblock.10857
>                   U cl_boot
>                   U cl_symbols
>                   U _ecl_frs_push
>                   U ecl_init_module
>                   U ecl_make_codeblock
>                   U ecl_process_env
>                   U _GLOBAL_OFFSET_TABLE_
>                   U init_lib_BASE
>                   U init_lib_CL_CHANGE_CASE
>                   U init_lib_CL_PPCRE
>                   U init_lib_CL_PPCRE_UNICODE
>                   U init_lib_CL_UNICODE
>                   U init_lib_EMBEDDED_CONSOLE
> 0000000000000000 T init_lib_EMBEDDED_CONSOLE__ALL_SYSTEMS
>                   U init_lib_STR
> 0000000000000110 T main_lib_EMBEDDED_CONSOLE__ALL_SYSTEMS
>                   U _setjmp
> nm: cl-ppcre.a: File format not recognized
> nm: base.a: File format not recognized
> nm: cl-unicode.a: File format not recognized
> nm: cl-ppcre-unicode.a: File format not recognized
> nm: cl-change-case.a: File format not recognized
> nm: str.a: File format not recognized
> nm: embedded-console.a: File format not recognized
>
> What am i doing wrong? What should i change to get static library
> containing all systems i am intending to use (and maybe only them, if
> possible)?