[Armadillo:07529] Re: clock_gettime()の参照解決

Takenoshita Koyo email@hidden
2011年 9月 5日 (月) 17:51:37 JST


竹之下です。

> ----------------------------------------------------
> -lrtの指定をmakeの依存関係のところ
> (ターゲット名 コロン の右横部分)に記述していました。
> これをLDFLAGS変数に設定するように移動したところ、
> 問題が解決しました。
> オライリーの書籍"GNU Make 第3版"に、
> -lrtのようなオプションを依存関係のところに記述する例が
> あったので、真似していたのですが、
> ここで指定すると、/usr/libを見にいってしまうようです。
> 依存関係以外の箇所に配置すれば、
> 本件のような問題は発生しません。
> ----------------------------------------------------
makeの、この機能のことを知りませんでした。

info make で確認してみたところ、以下のセクションに確かに
記載がありますね。
> 4.5.6 Directory Search for Link Libraries
> 
> When a prerequisite's name has the form `-lNAME', `make' handles it
> specially by searching for the file `libNAME.so' in the current
> directory, in directories specified by matching `vpath' search paths
> and the `VPATH' search path, and then in the directories `/lib',
> `/usr/lib', and `PREFIX/lib' (normally `/usr/local/lib', but
> MS-DOS/MS-Windows versions of `make' behave as if PREFIX is defined to
> be the root of the DJGPP installation tree).

GNU Make拡張なのでしょうか?

makeのこの機能を利用してクロスコンパイルする場合、
VPATH変数を指定してあげれば良いようです。
(一番最初のメールでVPATH変数を指定していると書かれていた意味が
 ようやく理解できました。)

この機能を使うと、先に例示したmakefileは以下のようにも記述できます。
============ makefile ここから ======================
CROSS := arm-linux-gnueabi

ifneq ($(CROSS),)
CROSS_PREFIX := $(CROSS)-
VPATH = /usr/$(CROSS)/lib
endif

CC = $(CROSS_PREFIX)gcc
CFLAGS = -Wall -Wextra -O2

all: target

target: -lrt target.o
	$(CC) $^ $(LDLIBS) -o $@

clean:
	$(RM) *~ *.o $(TARGET)

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<
============ makefile ここまで ======================

GNU Make 3.81で動作確認しました。

(2011年09月05日 17:14), nakayama junichi wrote:
> 竹之下様
> 
> いつもお世話になっております。
> ONICOSの中山と申します。
> 
>> 先ほど例示したmakefileは、PKGCONFIG_PATHを除くと、
>> 「Armadillo 実践開発ガイド」で紹介しているテンプレート通りの書き方にな 
>> ります。
>> http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2.1.0/ch07.html#fig_makefile_for_cross_compile 
>>
>>
>> このmakefileで、一度ビルドを試していただくことはできますでしょうか?
> 
> ご指摘を受けてMakefileを修正したところ、
> ビルドが通りました。
> 
> 問題の原因はかなり細かい話になりますが、説明させていただきます。
> 以下のとおりです。
> ----------------------------------------------------
> -lrtの指定をmakeの依存関係のところ
> (ターゲット名 コロン の右横部分)に記述していました。
> これをLDFLAGS変数に設定するように移動したところ、
> 問題が解決しました。
> オライリーの書籍"GNU Make 第3版"に、
> -lrtのようなオプションを依存関係のところに記述する例が
> あったので、真似していたのですが、
> ここで指定すると、/usr/libを見にいってしまうようです。
> 依存関係以外の箇所に配置すれば、
> 本件のような問題は発生しません。
> ----------------------------------------------------
> 
> 以上、よろしくお願いいたします。
> 
> -----------------------------------
> 中山 純一(Nakayama Junichi)
> オニコス株式会社
> TEL:03-5850-4345
> FAX:03-3801-3051
> e-mail:email@hidden
> -----------------------------------
> 
> 
> --------------------------------------------------
> From: "Takenoshita Koyo" <email@hidden>
> Sent: Monday, September 05, 2011 4:18 PM
> To: <email@hidden>
> Subject: [Armadillo:07524] Re: clock_gettime()の参照解決
> 
>> 竹之下です。
>>
>> 申し訳ありません。少し訂正します。
>>
>>> もし、共有ファイルが存在するのに、それを見つけてくれない場合、
>>> PKGCONFIG_PATHが適切に設定されていない場合が考えられます。
>> 今回の場合、pkgconfigは使って無いので、PKGCONFIG_PATHは関係ないですね。
>>
>> 先ほど例示したmakefileは、PKGCONFIG_PATHを除くと、
>> 「Armadillo 実践開発ガイド」で紹介しているテンプレート通りの書き方にな 
>> ります。
>> http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2.1.0/ch07.html#fig_makefile_for_cross_compile 
>>
>>
>> このmakefileで、一度ビルドを試していただくことはできますでしょうか?
>>
>> (2011年09月05日 15:50), Takenoshita Koyo wrote:
>>> 竹之下です。
>>>
>>>> 共有ライブラリを使用して、ダイナミックリンクできると一番いいのです 
>>>> が。。。
>>> 共有ライブラリは、存在していますか?
>>>
>>> 手元の環境では、以下のようになっています。
>>> [ATDE ~]$ ls -l /usr/arm-linux-gnueabi/lib/librt*
>>> -rw-r--r-- 1 root root 26572 2009-10-21 19:01 
>>> /usr/arm-linux-gnueabi/lib/librt-2.7.so
>>> -rw-r--r-- 1 root root 63858 2009-10-21 19:06 
>>> /usr/arm-linux-gnueabi/lib/librt.a
>>> lrwxrwxrwx 1 root root 10 2010-06-10 23:00 
>>> /usr/arm-linux-gnueabi/lib/librt.so -> librt.so.1
>>> lrwxrwxrwx 1 root root 12 2010-06-10 23:00 
>>> /usr/arm-linux-gnueabi/lib/librt.so.1 -> librt-2.7.so
>>>
>>> もし、共有ファイルが存在するのに、それを見つけてくれない場合、
>>> PKGCONFIG_PATHが適切に設定されていない場合が考えられます。
>>>
>>> makefileとして、以下のものを使うとlibrtを探してくれるようになりません 
>>> でしょうか?
>>> targetの部分は、適当に読み替えてください。
>>>
>>> ============ makefile ここから ======================
>>> CROSS := arm-linux-gnueabi
>>>
>>> ifneq ($(CROSS),)
>>> CROSS_PREFIX := $(CROSS)-
>>> PKGCONFIG_PATH := /usr/$(CROSS)/lib/pkgconfig
>>> endif
>>>
>>> CC = $(CROSS_PREFIX)gcc
>>> CFLAGS = -Wall -Wextra -O2
>>> LDFLAGS = -lrt
>>>
>>> all: target
>>>
>>> target: target.o
>>> $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
>>>
>>> clean:
>>> $(RM) *~ *.o $(TARGET)
>>>
>>> %.o: %.c
>>> $(CC) $(CFLAGS) -c -o $@ $<
>>> ============ makefile ここまで ======================
>>>
>>> もし、それでもダメな場合、makefile とビルドログを見せていただくことは 
>>> できますか?
>>>
>>> (2011年09月05日 15:28), nakayama junichi wrote:
>>>> いつもお世話になっております。
>>>> ONICOSの中山と申します。
>>>>
>>>> 標題の件ですが、
>>>> ATDE環境にある
>>>> /usr/arm-linux-gnueabi/lib/librt.a
>>>> を直接スタティックリンクするという方法でとりあえず解決しました。
>>>>
>>>> 共有ライブラリを使用して、ダイナミックリンクできると一番いいのです 
>>>> が。。。
>>>>
>>>> -----------------------------------
>>>> 中山 純一(Nakayama Junichi)
>>>> オニコス株式会社
>>>> TEL:03-5850-4345
>>>> FAX:03-3801-3051
>>>> e-mail:email@hidden
>>>> -----------------------------------
>>>>
>>>>
>>>> --------------------------------------------------
>>>> From: "nakayama junichi"<email@hidden>
>>>> Sent: Monday, September 05, 2011 2:39 PM
>>>> To: "Armadillo series general discussion list"
>>>> <email@hidden>
>>>> Subject: [Armadillo:07514] Re:clock_gettime()の参照解決
>>>>
>>>>> いつもお世話になっております。
>>>>> ONICOSの中山と申します。
>>>>>
>>>>>> あるプログラムでclock_gettime()システムコールを呼んでいるのですが、
>>>>>> これをクロスコンパイルしようとすると参照エラーになります。
>>>>>
>>>>> 補足情報です。
>>>>> コンフィグレーションで、使用するCライブラリは
>>>>> (None) Libc Version
>>>>> と設定しており、
>>>>> ATDE3の/home/atmark/atmark-dist-20110704/lib
>>>>> にはlibrtがない状態です。
>>>>>
>>>>> email@hidden:~/atmark-dist$ ls 
>>>>> /home/atmark/atmark-dist-20110704/lib -l
>>>>> 合計 104
>>>>> -rw-r--r-- 1 atmark atmark 5840 2011-07-04 12:10 Makefile
>>>>> drwxr-xr-x 7 atmark atmark 4096 2011-07-04 12:10 STLport
>>>>> drwxr-xr-x 6 atmark atmark 4096 2011-07-04 12:10 adns
>>>>> drwxr-xr-x 11 atmark atmark 4096 2011-07-04 12:10 expat
>>>>> drwxr-xr-x 2 atmark atmark 4096 2011-07-04 12:10 flex
>>>>> drwxr-xr-x 2 atmark atmark 4096 2011-07-04 12:10 libaes
>>>>> drwxr-xr-x 5 atmark atmark 4096 2011-07-04 12:10 libatm
>>>>> drwxr-xr-x 24 atmark atmark 4096 2011-07-04 12:10 libc
>>>>> drwxr-xr-x 7 atmark atmark 4096 2011-07-04 12:10 libccmalloc
>>>>> drwxr-xr-x 2 atmark atmark 4096 2011-07-04 12:10 libcrypt_old
>>>>> drwxr-xr-x 2 atmark atmark 4096 2011-07-04 12:10 libdes
>>>>> drwxr-xr-x 3 atmark atmark 4096 2011-07-04 12:10 libg
>>>>> drwxr-xr-x 11 atmark atmark 4096 2011-07-04 12:10 libgmp
>>>>> drwxr-xr-x 2 atmark atmark 4096 2011-07-04 12:10 libjpeg
>>>>> drwxr-xr-x 10 atmark atmark 4096 2011-07-04 12:10 libldap
>>>>> drwxr-xr-x 2 atmark atmark 4096 2011-07-04 12:10 libm
>>>>> drwxr-xr-x 2 atmark atmark 4096 2011-09-05 13:23 libnet
>>>>> lrwxrwxrwx 1 atmark atmark 53 2011-09-05 14:18 libnet.a ->
>>>>> /home/atmark/atmark-dist-20110704/lib/libnet/libnet.a
>>>>> drwxr-xr-x 11 atmark atmark 4096 2011-07-04 12:10 libpam
>>>>> drwxr-xr-x 7 atmark atmark 4096 2011-07-04 12:10 libpcap
>>>>> drwxr-xr-x 5 atmark atmark 4096 2011-07-04 12:10 libpng
>>>>> drwxr-xr-x 4 atmark atmark 4096 2011-08-01 16:44 libsysfs2
>>>>> drwxr-xr-x 5 atmark atmark 4096 2011-07-04 12:10 libupnp
>>>>> lrwxrwxrwx 1 atmark atmark 49 2011-09-05 14:18 libz.a ->
>>>>> /home/atmark/atmark-dist-20110704/lib/zlib/libz.a
>>>>> drwxr-xr-x 7 atmark atmark 4096 2011-09-05 13:23 nss-mdns
>>>>> drwxr-xr-x 4 atmark atmark 4096 2011-07-04 12:10 prebuild
>>>>> drwxr-xr-x 7 atmark atmark 4096 2011-09-05 13:23 zlib
>>>>>
>>>>> 以上、よろしくお願いいたします。
>>>>>
>>>>> -----------------------------------
>>>>> 中山 純一(Nakayama Junichi)
>>>>> オニコス株式会社
>>>>> TEL:03-5850-4345
>>>>> FAX:03-3801-3051
>>>>> e-mail:email@hidden
>>>>> -----------------------------------
>>>>>
>>>>>
>>>>> --------------------------------------------------
>>>>> From: "nakayama junichi"<email@hidden>
>>>>> Sent: Monday, September 05, 2011 1:50 PM
>>>>> To: "atmarktechno ML"<email@hidden>
>>>>> Subject: [Armadillo:07512]clock_gettime()の参照解決
>>>>>
>>>>>> いつもお世話になっております。
>>>>>> オニコス株式会社の中山と申します。
>>>>>>
>>>>>> ATDE3環境で、Armadillo-440上で動作するアプリケーションを開発してい 
>>>>>> ます。
>>>>>> あるプログラムでclock_gettime()システムコールを呼んでいるのですが、
>>>>>> これをクロスコンパイルしようとすると参照エラーになります。
>>>>>>
>>>>>> librtをリンクしていないので、当り前なのですが、
>>>>>> -lrtというオプションを付けると
>>>>>> /usr/arm-linux-gnueabi/lib/
>>>>>> ではなく、
>>>>>> /usr/lib/にあるライブラリをリンクしようとするのです。
>>>>>> このため、ファイルフォーマットが違う、というメッセージが出てビルドに
>>>>>> 失敗します。
>>>>>> (なお、こちらで作成したMakefileではVPATH変数の値を上書きしております)
>>>>>>
>>>>>> 初歩的な問題かもしれませんが、
>>>>>> アドバイス等をいただけますと幸いです。
>>>>>>
>>>>>> 以上、よろしくお願いいたします。
>>>>>>
>>>>>> -----------------------------------
>>>>>> 中山 純一(Nakayama Junichi)
>>>>>> オニコス株式会社
>>>>>> TEL:03-5850-4345
>>>>>> FAX:03-3801-3051
>>>>>> e-mail:email@hidden
>>>>>> -----------------------------------
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> armadillo mailing list
>>>>>> email@hidden
>>>>>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>>>>
>>>>> _______________________________________________
>>>>> armadillo mailing list
>>>>> email@hidden
>>>>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>>>
>>>> _______________________________________________
>>>> armadillo mailing list
>>>> email@hidden
>>>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>>>
>>>
>>>
>>
>>
>> -- 
>> Koyo Takenoshita
>>
>> _______________________________________________
>> armadillo mailing list
>> email@hidden
>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo 
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 


-- 
Koyo Takenoshita




armadillo メーリングリストの案内