cygwin/msys bash でコマンドライン引数として「pkg-config」を使用する
-
01-07-2019 - |
質問
Windows上でビルド環境としてcygwinを使用しようとしています。サードパーティのパッケージ (GTK+ など) にいくつかの依存関係があります。
通常、Linux でビルドする場合、Makefile で pkg-config への呼び出しを gcc への引数として追加できるため、次のようになります。
gcc example.c `pkg-config --libs --cflags gtk+-2.0`
これは Linux では正常に動作しますが、cygwin では次のようになります。
:Invalid argument make: *** [example] Error 1
現在、pkg-config を手動で実行し、出力を Makefile に貼り付けているだけですが、これは本当にひどいことです。この問題を回避または修正する良い方法はありますか?
メイクは犯人ではない。make が gcc を呼び出すために使用するコマンド ラインをコピーして貼り付けると、それ自体で gcc が実行され、「:」で停止します。無効な引数"。
コマンドライン引数を出力するための小さなテストプログラムを作成しました。
for (i = 0; i < argc; i++)
printf("'%s'\n", argv[i]);
一重引用符に注目してください。
$ pkg-config --libs gtk+-2.0 -Lc:/mingw/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpang owin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule- 2.0 -lglib-2.0 -lintl
テスト プログラムを実行します。
$ ./t `pkg-config --libs gtk+-2.0` 'C:\cygwin\home\smo\pvm\src\t.exe' '-Lc:/mingw/lib' '-lgtk-win32-2.0' '-lgdk-win32-2.0' '-latk-1.0' '-lgdk_pixbuf-2.0' '-lpangowin32-1.0' '-lgdi32' '-lpangocairo-1.0' '-lpango-1.0' '-lcairo' '-lgobject-2.0' '-lgmodule-2.0' '-lglib-2.0' '-lintl' '
最後の行の一重引用符に注目してください。argc が本来より 1 大きく、argv[argc - 1] が null のようです。Linux で同じテストを実行しても、この結果は得られません。
そうは言っても、たとえば、バックティック演算子を使用する代わりに、Makefile に pkg-config の結果を変数に保存させ、その変数を使用させる方法はあるでしょうか?
解決
そうは言っても、たとえば、バックティック演算子を使用する代わりに、Makefile に pkg-config の結果を変数に保存させ、その変数を使用させる方法はあるでしょうか?
GTK_LIBS = $(shell pkg-config --libs gtk+-2.0)
他のヒント
Cygwin が提供する make を使用していますか?使用
which make
make --version
確認するには、「/usr/bin/make」と「GNU Make 3.8 [...]」または同様のものが返されるはずです。
うーん...やってみました
make -d
これにより、いくつかの (大量の) デバッグ出力が得られます。
私の推測では、cygwin の gcc は -Lc:/mingw/lib を処理できないのではないかと思います。それを cygwin パスに変換してみてください。
GTK_LIBS = $(patsubst -Lc:/%,-L/cygdrive/c/%,$(shell pkg-config --libs gtk+-2.0))
「t」出力の末尾の一重引用符は、CRLF 変換のアーティファクトである可能性があります。pkg-config は cygwin アプリですか?GNU make はさまざまな行末スタイルをかなり許容しているようであるため、以前に投稿した $(shell) ソリューションがこれに役立つかもしれません。
私も同様の問題を抱えていましたが、ここで解決策を見つけました。 http://www.demexp.org/dokuwiki/en:demexp_build_on_windows
/usr/bin/pkg-config を使用するように、PATH 内で /usr/bin を /cygwin/c/GTK/bin の前に置くように注意してください。これが必要なのは、GTK の pkg-config がパスを後処理し、多くの場合、同等の Windows 絶対パスに変換するためです。その結果、cygwin 下のツールはそれらのパスを理解できない可能性があります。