Hi,

This is my first try at ECL, and need help in figuring out what is missing. I had tried googling for similar examples but did not found one that demoed what i wanted.

I'm trying to define a function named sum-array in CL, which is defined in a file called foo.lisp

I compiled foo.lisp, generated foo.o, and then used that to create a shared library libtest.so

Finally I created a C file named try.c that will load libtest.so dynamically, which succeeded, but failed to locate the symbol L1sum_array or demo_sum_array.

I double checked the files and the online resources (docs, and some online tutorials), but couldn't find a clue on what I was missing.

the files and the steps used to compile the example are attached below for reference.

Ala'a

----------------------------------------------------------------------

;; foo.lisp
(defpackage "DEMO"
  (:use :cl)
  (:export "SUM-ARRAY"))

;; using the following
;;;(declaim (si::c-export-fname sum-arary))
;; gave me
;;Unknown declaration specifier SI::C-EXPORT-FNAME
;; so instead I tried 'proclaim', but it seem to have
;; no effect as the generated symbol name is L1sum_array rather than demo_sum_array
(proclaim '(si::c-export-fname sum-arary))

(defun sum-array (array)
  (loop for i from 0 below (length array)
        summing (aref array i)))

----------------------------------------------------------------------


; launch ECL in a console
; ecl -norc
; then execute the following.
;> (compile-file "foo.lisp" :c-file t :h-file t :data-file t :system-p t)
;> (c:build-shared-library "test" :lisp-files '("foo.o"))

----------------------------------------------------------------------

// try.c
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(char **argv, int argc) {
  void * libhandle;
  int (*demo_sum_array)(int[]);
  int nums[10] = {1, 2, 0, 0, 4, 5, 6, 9, 9, 17};

  // Load Shared library
  libhandle = dlopen("./libtest.so",RTLD_NOW);
  if(libhandle==NULL) {
    fprintf(stderr, "Couldn't open library: %s\n",
   dlerror());
    exit(1);
  }

  // summ-array
  ////demo_sum_array  = dlsym(libhandle,"demo_sum_array");
  demo_sum_array  = dlsym(libhandle,"L1sum_array");
  if(demo_sum_array == NULL) {
    /* ERROR HANDLING */
    fprintf(stderr, "%s\n", dlerror());
    exit(1);
  }

  printf("Return is %i\n",(*demo_sum_array)(nums));

  dlclose(libhandle);

  return 0;

}

----------------------------------------------------------------------

: gcc -g try.c -o try -L./ -ltest -ldl

: ./try 
./libtest.so: undefined symbol: L1sum_array