Autotools에서처럼 CMake에서 헤더 파일과 라이브러리 기능을 확인하는 방법은 무엇입니까?
문제
현재 작은 C 프로젝트를 변환 중입니다. 자동 도구 에게 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를 수행하는 것입니다.
컴파일러가 이미 필요한 헤더 파일을 확인하고 링커가 라이브러리 함수를 확인한다는 사실에도 불구하고 내 코드는 컴파일 플래그를 적절하게 설정하기 위해 여전히 구성 단계에서 이러한 확인을 수행해야 합니다. #ifdef HAVE_FOOBAR
그리고 비슷합니다.
이 경우 CMake로 헤더/함수를 확인하는 가장 좋은 방법은 무엇입니까?
해결책
다음을 사용하여 쉽게 직접 포팅할 수 있습니다. CHECK_FUNCTION_EXISTS
, CHECK_INCLUDE_FILE
, CHECK_TYPE_SIZE
, 등.또한 참조하십시오 CMake_HowToDoPlatformChecks 조언을 구합니다.
이 스타일로 구성하면 이식성이 추가됩니다(예: ucontext.h
그리고 setjmp.h
존재하는 것을 사용하여 코드를 수정하십시오. #ifdef HAVE_UCONTEXT
또는 #ifdef HAVE_SETJMP
).
또한 애플리케이션을 배포할 때 (사용자의 경우) 컴파일 오류가 발생하는 것을 방지하고 싶으므로 좋은 빌드 시스템을 사용하면 앱을 배포하기 전에 대부분의 아키텍처 차이를 처리할 수 있습니다.
프로그래머가 아닌 사람은 "gtk+ 헤더 확인 - 실패"가 발생하면 동일한 내용을 말하지만 대부분 읽을 수 없는 컴파일 오류 줄이 많이 생기기보다는 gtk를 설치해야 한다는 것을 이해하기가 더 쉽습니다. :)