SWIG の extconf.rb にライブラリ パスとその他のフラグを適切に含める方法は?
概要
コマンドを使用して C ファイルをコンパイルするとします。
g++ a.cpp -I/usr/local/gr/include -L/usr/local/gr/lib -lGR -lm -Wl,-rpath,/usr/local/gr/lib
リンカー パスを無視しないように SWIG で extconf.rb ファイルを定義するにはどうすればよいですか? これが現在の extconf.rb ファイルです。
require 'mkmf'
system('swig -c++ -ruby example.i') or abort
$CXXFLAGS += " -I/usr/local/gr/include -L/usr/local/gr/lib -lGR -lm -Wl,-rpath,/usr/local/gr/lib "
create_makefile('example')
リンカーフラグを無視してエラーが発生します
clang: warning: -lGR: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -lm: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -Wl,-rpath,/usr/local/gr/lib: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-L/usr/local/gr/lib' [-Wunused-command-line-argument]
解決策
Ruby やビルドシステムについてほとんど何も知らないので、次のように変更したいと思われるでしょう:
require 'mkmf'
system('swig -c++ -ruby example.i') or abort
$CXXFLAGS += " -I/usr/local/gr/include "
$LDFLAGS += " -L/usr/local/gr/lib -lGR -lm -rpath,/usr/local/gr/lib "
create_makefile('example')
通常、ビルド システムはコンパイルとリンクを 2 つの別々のフェーズに分割し、コンパイル フラグは CCFLAGS/CXXFLAGS (それぞれ C および C++ コンパイラ用) という名前の変数から取得され、リンカー フラグは慣例により LDFLAGS から取得されるためです。
Clang から表示されるエラー メッセージは、Clang がコンパイラとして呼び出されていることを示しており、コンパイル時 (リンクではなく) のみの場合、リンクにのみ適用される追加のオプションが無視されることを示しています。
ここで行ったように、引数の -Wl 部分を削除する必要があるかどうかは、リンカー (通常は /usr/bin/ld) を直接呼び出しているか、clang/ を使用しているかによって決定されます。 gcc をリンカーとして使用します。