私はlibtool
とyasm
を連携させようとしています。libtoolにyasmで作成されたオブジェクトファイルを組み込むことができません
yasm
は私の.asm
ソースから正しい.o files
を作成しますが、私は、関連する.lo
と.dep
ファイルを構築するためにlibtool
を取得する方法を見つけ出すことはできません。 .o
ファイルを組み込んだ共有ライブラリを構築したいと考えています。
私はlibtool
とyasm
を連携させようとしています。libtoolにyasmで作成されたオブジェクトファイルを組み込むことができません
yasm
は私の.asm
ソースから正しい.o files
を作成しますが、私は、関連する.lo
と.dep
ファイルを構築するためにlibtool
を取得する方法を見つけ出すことはできません。 .o
ファイルを組み込んだ共有ライブラリを構築したいと考えています。
libtool
生成されるファイルは、通常、次のレイアウトを使用します。ファイルは、build
ディレクトリのロケーションメタデータで構成されます。静的オブジェクト.o
はbuild
ディレクトリにあります。 build/.libs
ディレクトリにあるPIC /共有の.o
オブジェクトです。
libtoolコンパイルモードを使用できます。私はヤスムに慣れていないので、スイッチを記入する必要があります。 yasm
ビルドは2回実行され、1回は-DPIC
(およびその他の共有オブジェクトオプション)で実行されます。
libtool --tag=CC --mode=compile yasm <options> src.asm
automakeにを使用している場合、これは.asm
ファイルの明示的なルールが必要な場合があります。
.asm.lo:
$(LIBTOOL) --tag=CC --mode=compile \
yasm <options> $<
は(8)空白文字、それらは、メイクファイル内のタブであることを念頭に置いていないしてください! この前に追加する必要があります:.SUFFIXES: .asm .lo
。私は$(LIBTOOL)
という変数を使用していますが、プラットフォーム(OSXなど)によってはglibtool
としてインストールする必要がありますが、それはMakefile.in
です。
生成されたsrc.lo
,src.o
,.libs/src.o
は、例えばmake clean
であるとみなされます。
ライブラリlibfoo
の場合、automakeにEXTRA_libfoo_la_SOURCES = src.asm
、obj depsをlibfoo_la_LIBADD = src.lo
と指定して、これらのソースについて知る必要があります。依存関係を追加する価値があるかもしれません:libfoo_la_DEPENDENCIES = src.lo
。
src.asm
をlibfoo_la_SOURCES
に入れるだけでは不十分ですが、なぜわかりませんが
これはうまくいきます(ただし、ターゲットディレクトリに.lo
ファイルを作成する方法、またはターゲットディレクトリの.libs
ディレクトリを作成する方法を理解したことはありません)。
Makefileのルール:
# Rule to build object files from asm files.
#
# XXX
# Libtool creates the .lo file in the directory where make is run. Move the file
# into place explicitly; I'm sure this is wrong, but have no idea how to fix it.
# Additionally, in a parallel make, the .libs file may not yet be created, check
# as necessary, but ignore errors.
.asm.lo:
-d=`dirname [email protected]`; test $d/.libs || mkdir $d/.libs
$(LIBTOOL) --tag=CC --mode=compile sh $(srcdir)/dist/yasm.sh $< [email protected]
rm -f [email protected]
mv `basename [email protected]` [email protected]
yasm通話を行うにサポートシェルスクリプト:私はあまりにも終わったところ
#! /bin/sh
# Libtool support for yasm files, expect the first argument to be a path to
# the source file and the second argument to be a path to libtool's .lo file.
# Use the second argument plus libtool's -o argument to set the real target
# file name.
source=$1
target=`dirname $2`
while test $# -gt 0
do
case $1 in
-o)
target="$target/$2"
shift; shift;;
*)
shift;;
esac
done
yasm -f x64 -f elf64 -X gnu -g dwarf2 -D LINUX -o $target $source
はこれはかなりある、との問題があります:最初、_ .asm.lo_コマンドはlibtoolによって一度だけ実行されます(シェルスクリプトをyasmのフロントエンドとして使用しています。そのシェルスクリプトは "make XXX.lo"コマンドに応答して一度だけ実行されます)。 _XXX.lo_ファイルは、ソースディレクトリではなく最上位のMakefileディレクトリに作成されます。シェルスクリプトを変更して、_.libs/XXX.o_と_XXX.o_の両方を1回の実行で作成し、_XXXを移動することができました。lo_ファイルを明示的に使用していますが、これは壊れやすいようです(共有ライブラリを作成しない場合は間違っています)。 –
編集:私は静的オブジェクトと共有オブジェクトの両方を作成する際に私が間違っている箇所を見つけました。スクリプトのエラーです。 libtoolが_XXX.lo_ファイルを作成するレシピはありますか? –