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.gerbersha...@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 <tru...@gmail.com <mailto:tru...@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)? > >