如何在 Ruby 中使用 mkmf 访问共享库文件?



我在这里尝试使用libcsv。头文件csv.h/usr/include目录中,共享库文件libcsv.so/usr/lib64(Fedora 35)。

现在,我能够使用 shell 命令使 gem 文件工作:

gcc -c -fPIC rcsv.c -o rcsv.o
gcc -shared -lcsv rcsv.o -o rcsv.so

我必须手动将 .so 文件移动到lib/rcsv/,这很不方便,不利于 安装 gem。

我想在extconf.rb中以 Ruby 格式的代码编写相同的代码。我应该怎么做?

extconf.rb

require 'mkmf'
have_header("csv.h")
have_library('libcsv.so')
create_makefile('rcsv/rcsv')

耙子日志

(in /home/<username>/Desktop/rcsv)
mkdir -p tmp/x86_64-linux/rcsv/3.0.3
cd tmp/x86_64-linux/rcsv/3.0.3
/home/<username>/.asdf/installs/ruby/3.0.3/bin/ruby -I. -r.rake-compiler-siteconf.rb ../../../../ext/rcsv/extconf.rb
checking for csv.h... yes
checking for -llibcsv.so... no
creating Makefile
cd -
cd tmp/x86_64-linux/rcsv/3.0.3
/usr/bin/gmake
compiling ../../../../ext/rcsv/rcsv.c
linking shared-object rcsv/rcsv.so
cd -
mkdir -p tmp/x86_64-linux/stage/lib/rcsv
/usr/bin/gmake install target_prefix=
/usr/bin/install -c -m 0755 rcsv.so /home/<username>/Desktop/rcsv/lib/rcsv
cp tmp/x86_64-linux/rcsv/3.0.3/rcsv.so tmp/x86_64-linux/stage/lib/rcsv/rcsv.so
Loaded suite /home/<username>/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/rake_test_loader
Started
/home/<username>/.asdf/installs/ruby/3.0.3/bin/ruby: symbol lookup error: /home/<username>/Desktop/rcsv/lib/rcsv/rcsv.so: undefined symbol: csv_init
rake aborted!
Command failed with status (127)
Tasks: TOP => default => test
(See full trace by running task with --trace)

extconf.rb中的上述代码是正确的,但不是have_library('libcsv.so')中的字符串值,它应该被'csv'而不是'libcsv.so'

因此,总的来说,extconf.rb文件应如下所示:

require 'mkmf'
have_header("csv.h")
have_library('csv')
create_makefile('rcsv/rcsv')

最新更新