gendefのバグ?

GW後半に秋月で何気に AE-FT232HL を買いました。別に非同期シリアルが欲しかったわけではなく、PC上からポートをパタパタと手軽に出来る物が欲しかったのです。

PCがWin7だから制御はFTDI社製のD2XXを使えば良いのだけれども、GW前半にUrJTAGをlibftdi1仕様でコンパイルしていた経緯もあり、FT232Hもlibftdi1で制御しようと思ったのです。この作業中に少しはまってしまった事があるので備忘録代わりに書いておきます。

事の発端はlibftdi1の ftdi_get_library_version という関数を呼び出した時にリンカで "そんなのないぞ!!" と言われてしまった事です。libftdi1のヘッダーを見るとちゃんとあるし、libftdi1.dllの中身を見てもあるように見えます。色々とやってみて解ったのが、リンクする時に使う libftdi1.dll.a というライブラリが変だという事。これって、gendef と dlltool を使って libftdi1.dll から逆生成した物なんですよね。本当は自分で生成しなくても、libftdi1.dllを作成する時に副産物として出来てるはずなんですが、諸事情があり、cygwin + mingw 環境では作成していなかったので、やむなく逆生成したわけです。

libftdi1.dllを作成するには、cmakeを使う必要があって、これが厄介なために cygwin + mingw, msys + mingw での生成に失敗しただけなんですが…。因みに、使っている libftdi1.dll はLinuxでクロスコンパイルしました。

問題となったのは、gendef が吐き出す内容でした。今回使用する関数に限って以下の様な関数名で吐き出されていました。

ftdi_get_library_version@4


"@"以降が邪魔です。dlltoolで libftdi1.dll.a を生成した時もその中にマルッと書いてくれちゃってますので、リンカが "ftdi_get_library_version なんてないぞ!!" と言ってくる訳です。正直、WindowsのDLL、ライブラリ等のシンボル名に詳しくないので、"@"以降が必要かどうか全く解りません。が、これをクリアしないと先に進めないので、手動で編集した所、うまくコンパイル出来ました(実行も出来ています)。修正箇所が1カ所だけだったので手作業でも何とかなるのですが、今後の事も考えて以下の様にするとよいかもしれません。

$ gendef - ./libftdi1.dll | sed -e "s/@/;/" > libftdi1.dll.def
$ i686-w64-mingw32-dlltool.exe -d ./libftdi1.dll.def -D libftdi1.dll -l libftdi1.dll.a


"@" を ";" に置き換えているだけです。これで以降がコメント扱いになります。

因みに、Linuxでクロスコンパイルした時の副産物(libftdi1.dll.a, libftdi1.a)はcygwin + mingw上でも使える(同じ w64-minge32 を使用しています)のでコピーしてもよかった気もします。
スポンサーサイト

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux トランジスタ式ミニワッター TRminiWatterPart4 MPD OpenOCD イーサネットコンバータ FON2405E DAC buildroot FM3ペリフェラル BeagleBoneBlack FM3評価ボード library OpenGL mingw ODROID-U2 TL-WR700N Edison bitbake KiCad 計測 VMware シングル FM4 ミニワッター 6N6P プリアンプ 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter