As far as i can tell, my central registry isn't set up. After starting ECL and loading ASDF, when I check asdf:*central-registry*, it is empty.
It must be noted, however, that to get to :str package that I want to use, I must load :ecl-quicklisp, which adds path ~/quicklisp/quicklisp to the central registry. In any way, it doesn't seem that there is code of uiop in there.
I have tried compiling with listing "asdf", "uiop" as dependencies to no success. The problem still persists.
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 at 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:
- (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 at 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... 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 at gmail.com <mailto:trus19 at 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)?
This is something I experienced a couple weeks ago. The solution is to link your final executable against the 'contrib' libraries that ECL has compiled.
You need to add something like this to your compiler step: `-L/path/to/ecl -lasdf`
This email from last month's mailing list archives has more details/links to (Qt) examples: https://mailman.common-lisp.net/pipermail/ecl-devel/2020-November/011527.htm...
-Ava
On Wed, Dec 16, 2020, at 17:01, Иван Трусков wrote:
As far as i can tell, my central registry isn't set up. After starting ECL and loading ASDF, when I check asdf:*central-registry*, it is empty.
It must be noted, however, that to get to :str package that I want to use, I must load :ecl-quicklisp, which adds path ~/quicklisp/quicklisp to the central registry. In any way, it doesn't seem that there is code of uiop in there.
I have tried compiling with listing "asdf", "uiop" as dependencies to no success. The problem still persists.
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 at 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:
- (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 at 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... 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 at gmail.com <mailto:trus19 at 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)?