16

現在、小さな C プロジェクトをautotoolsからCMakeに変換しています。

以前はconfigure.in、次の行を使用して、すべてのヘッダーとライブラリ関数の存在を確認しました。

# Checks for header files
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h time.h math.h sys/stat.h errno.h unistd.h fcntl.h signal.h])

# Checks for library functions
AC_FUNC_FORK
AC_CHECK_FUNCS([time localtime mktime gmtime exit fork chdir atol signal])
AC_FUNC_STRFTIME

これは、多くのautotoolsプロジェクトがAFAIKで行っていることです。

コンパイラが必要なヘッダー ファイルを既にチェックし、リンカがライブラリ関数をチェックしているという事実にもかかわらず、私のコードでは、コンパイル フラグなどを適切に設定するために、configure 段階でこれらのチェックを実行する必要が#ifdef HAVE_FOOBARあります。

この場合、CMake でヘッダー/関数をチェックするベスト プラクティスは何ですか?

4

1 に答える 1

13

CHECK_FUNCTION_EXISTS、、などを使用して直接簡単に移植できます。アドバイスについてはCHECK_INCLUDE_FILECMake_HowToDoPlatformChecksCHECK_TYPE_SIZEも参照してください。


このスタイルで構成すると、移植性が向上します(つまり、存在するものを確認しucontext.hて使用し、またはsetjmp.hでコードを変更できます)。#ifdef HAVE_UCONTEXT#ifdef HAVE_SETJMP

さらに、アプリケーションを配布するときは、(ユーザーにとって)コンパイルエラーが発生しないようにする必要があります。したがって、優れたビルドシステムを使用すると、アプリを配布する前にアーキテクチャの違いのほとんどを処理できます。

プログラマーでない人にとっては、「gtk +ヘッダーのチェック-失敗」の場合、同じことを言うコンパイルエラー行がたくさんあるのではなく、gtkをインストールする必要があることを理解しやすくなりますが、ほとんどの場合は読み取れません:)

于 2009-03-17T08:43:35.343 に答える