Autotoolsで行われているように、CMakeでヘッダーファイルとライブラリ関数をチェックする方法は?
質問
現在、小さな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プロジェクトが知っていることです。
コンパイラはすでに必要なヘッダーファイルをチェックし、リンカーはライブラリ関数をチェックしますが、私のコードでは、 #ifdef HAVE_FOOBAR
のコンパイルフラグを適切に設定するために、configureステージでこれらのチェックを行う必要がありますなど。
この場合、CMakeでヘッダー/関数をチェックするベストプラクティスは何ですか?
解決
CHECK_FUNCTION_EXISTSを使用すると、簡単に直接移植できます。
、 CHECK_INCLUDE_FILE
、 CHECK_TYPE_SIZE
など。 CMake_HowToDoPlatformChecks を参照してください。
このスタイルで設定すると、移植性が追加されます(つまり、 ucontext.h
および setjmp.h
を確認し、存在するものを使用して、#でコードを変更できます。 ifdef HAVE_UCONTEXT
または #ifdef HAVE_SETJMP
)。
さらに、アプリケーションを配布するとき、コンパイルエラー(ユーザー向け)を避けたいため、適切なビルドシステムで、アプリケーションを配布する前にアーキテクチャの違いのほとんどを処理できます。
「プログラマー以外の人にとっては、「gtk +ヘッダーの確認-失敗」の場合、同じことを言っているがほとんどの人には読めないコンパイルエラー行がたくさんあるのではなく、gtkをインストールする必要があることを理解する方が簡単ですそれらの:)