2016-09-09 12 views

답변

0

libtool 생성 된 파일은 일반적으로 다음 레이아웃을 사용합니다. .lobuild 디렉토리의 위치 메타 데이터로 구성된 파일. 정적 객체 .obuild 디렉토리에 있습니다. 및 디렉토리의 PIC/shared .o 개체가 있습니다.

libtool 컴파일 모드를 사용할 수 있습니다. 나는 yasm에 익숙하지 않으므로 스위치를 채워야 할 것입니다. yasm 빌드를 두 번 실행하고 -DPIC (다른 공유 객체 옵션 일 수도 있음)으로 한 번 실행합니다.

.asm.lo: 
     $(LIBTOOL) --tag=CC --mode=compile \ 
     yasm <options> $< 

사람들은 메이크에서 탭,하지 (8) 공백 문자 있음을 알아 두셔야합니다 :

libtool --tag=CC --mode=compile yasm <options> src.asm

automake에를 사용하는 경우, 이것은 .asm 파일에 대한 명시 적 규정이 필요할 수 있습니다! 또한이 전에 .SUFFIXES: .asm .lo을 추가해야 할 수도 있습니다. 일부 플랫폼 (예 : OSX)이 glibtool으로 설치해야하고 $(LIBTOOL)이라는 변수를 사용합니다. 이는 Makefile.in입니다.

생성 된 src.lo, src.o, .libs/src.o은 예를 들어 make clean으로 간주되어야합니다.

라이브러리 libfoo의 경우 automake가 EXTRA_libfoo_la_SOURCES = src.asmlibfoo_la_LIBADD = src.lo 인 obj deps로이 소스에 대해 알릴 필요가 있습니다. 의존성을 추가하는 것이 유용 할 수도 있습니다 : libfoo_la_DEPENDENCIES = src.lo.

src.asmlibfoo_la_SOURCES에 넣는 것만으로는 충분하지 않습니다.

+0

이이며, 문제가 :

# 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 통화를 할 수 먼저 _ .asm.lo_ 명령은 libtool에 의해 한 번만 실행됩니다 (yasm의 프론트 엔드로 쉘 스크립트를 사용하고 있습니다. 쉘 스크립트는 "make XXX.lo"명령에 대한 응답으로 한 번만 실행됩니다). 두 번째로, _XXX.lo_ 파일은 소스 디렉토리가 아닌 최상위 Makefile 디렉토리에 작성됩니다. 한 번에 _.libs/XXX.o_와 _XXX.o_를 만들기 위해 쉘 스크립트를 바꿀 수 있었고 _XXX를 옮길 수있었습니다.lo_ 파일을 명시 적으로 만들었지 만 그렇게하는 것은 허약합니다 (공유 라이브러리를 만들지 않을 때는 잘못되었습니다). –

+0

편집 : 정적 객체와 공유 객체를 만들 때 어디서 잘못되었는지 알아 냈습니다. 스크립트 오류입니다. libtool이 _XXX.lo_ 파일을 생성하는 방법이 있습니까? –

0

libtool에서 대상 디렉토리에 .lo 파일을 만들거나 대상 디렉토리의 .libs 디렉토리를 만드는 방법을 알지 못했지만이 방법이 유용합니다.

Makefile을 규칙 : 꽤 많이 나는 너무 결국 어디

#! /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