我正试图编译一个C程序的例子,该程序嵌入了对C函数的回调的ECL。github。我通过用git clone git://git.code.sf.net/p/ecls/ecl ecl
、$ make
和# make install
克隆ECL repo安装了ECL(可嵌入公共Lisp),安装似乎还可以,至少ECL开发者指南:2.6编译器示例编译良好。
当试图用gcc ecldemo.c -lecl
编译ecldemo.c时,我得到了以下错误:
/usr/bin/ld: error: cannot find -lecl
/tmp/ccRk8Q48.o:ecldemo.c:function foo: error: undefined reference to 'ecl_make_integer'
/tmp/ccRk8Q48.o:ecldemo.c:function bar: error: undefined reference to 'ecl_make_integer'
/tmp/ccRk8Q48.o:ecldemo.c:function ecl_call: error: undefined reference to 'ecl_make_simple_base_string'
/tmp/ccRk8Q48.o:ecldemo.c:function ecl_call: error: undefined reference to 'si_string_to_object'
/tmp/ccRk8Q48.o:ecldemo.c:function ecl_call: error: undefined reference to 'si_safe_eval'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'cl_boot'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'cl_shutdown'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'ecl_make_simple_base_string'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'si_string_to_object'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'ecl_def_c_function'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'ecl_make_simple_base_string'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'si_string_to_object'
/tmp/ccRk8Q48.o:ecldemo.c:function init: error: undefined reference to 'ecl_def_c_function'
/tmp/ccRk8Q48.o:ecldemo.c:function main: error: undefined reference to 'ecl_make_simple_base_string'
/tmp/ccRk8Q48.o:ecldemo.c:function main: error: undefined reference to 'si_string_to_object'
/tmp/ccRk8Q48.o:ecldemo.c:function main: error: undefined reference to 'si_safe_eval'
/tmp/ccRk8Q48.o:ecldemo.c:function main: error: undefined reference to 'cl_print'
/tmp/ccRk8Q48.o:ecldemo.c:function main: error: undefined reference to 'cl_equal'
collect2: error: ld returned 1 exit status
我想知道这个错误行:
/usr/bin/ld: error: cannot find -lecl
在我看来,gcc
以某种方式将-lecl
解释为源文件,而不是作为选项-l library
(搜索名为library
的库)。在-l
和ecl
之间留一个空格(gcc ecldemo.c -l ecl
)没有帮助,输出是相同的(cannot find -lecl
)。
由于ecl.h
位于/usr/local/include/ecl/
中,而在ecldemo.c
中,它包含在#include "ecl/ecl.h"
中,我尝试添加一个带有-L
选项的库目录:
gcc -L /usr/local/include/ecl ecldemo.c -l ecl
但同样的错误usr/bin/ld: error: cannot find -lecl
仍然存在。
有什么想法可能导致这个错误,以及如何解决这个问题吗?
您的-L
选项错误。您需要告诉它在哪里可以找到库,而不是在哪里可以查找头文件。该库很可能被称为libecl.so
或libecl.a
或类似的名称。
不要直接指定-lecl
和-L...
,而是使用ecl-config
:
gcc `ecl-config --cflags` ecldemo.c -o ecldemo `ecl-config --libs`
基于http://ecls.sourceforge.net/ecldev/Compiler-examples.html
;;; Invoking external command: gcc -o "libmyecl.so" -L"/usr/lib/ecl/" "myecl.o" "hello.o" -Wl,–rpath,/usr/lib/ecl/ -shared -lecl -lgmp -lgc -ldl -lm
我想你需要
gcc -L/usr/lib/ecl ecldemo.c -lecl