2017-12-27 2 views
1

나는 최근 공용 헤더 내에서 HAVE_FEATUREFOO과 같은 변수를 사용하는 라이브러리를 발견했습니다.공용 헤더에서`AC_DEFINE`과`AC_DEFINE_UNQUOTED`에 정의 된 변수를 올바르게 사용하는 방법은 무엇입니까?

여기에는 #include "config.h" 문도 포함됩니다. 이러한 선언은 구조체 선언에도 사용되며 조건부로 구조체 멤버를 제거합니다. 라이브러리 빌드 및 종속 프로그램 빌드에 사용되는 값의 불일치로 인해 메모리가 손상 될 수 있습니다.

그래서, 라이브러리의 사용과 그것의 헤더는 다음과 같은 한 수 결과 :

  • #include "config.h" 실패,
  • 또는 런타임에 메모리 손상.

나는 autotools를 아주 새로운 해요,하지만 몇 가지 조사 후 나는 그들이 AC_DEFINE or AC_DEFINE_UNQUOTED를 사용하여 정의되는 것을 발견했습니다. 그리고 config.hAC_CONFIG_HEADERS을 사용하여 생성됩니다.

추가 연구를 통해 헤더를 설치하는 include_HEADERS을 발견했습니다. 그리고 헤더 config.h이 목록에 추가되면 올바르게 설치됩니다.

AC_CONFIG_HEADERS에 의해 자동 도구로 생성 된 config.h 헤더 파일을 설치하는 것이 올바른 방법입니까?

답변

1

생성 된 config.h 파일은 절대로 사용자 코드에 포함되어서는 안됩니다. 즉, 라이브러리 헤더가 구성 테스트와 독립적이어야하며 config.h을 설치하면 안됩니다.

1

AC_CONFIG_HEADERS가 autotools에서 생성 한 config.h 헤더 파일을 설치하는 것이 올바른 방법입니까? 프로젝트에 속하는 다른 설치 헤더 config.h에 의존하는 경우

, 다음 네, config.h도 설치해야합니다. 빌드 된 소프트웨어는 config.h에 기념일에 빌드 타임 빌드 시스템 속성에 의존하기 때문에 유일한 실행 가능한 방법입니다. 일반적으로 사실 이후에 그것을 올바르게 재창조 할 수는 없습니다.

그러나 설치 헤더 해야 처음부터하지#include Autotools가 config.h 헤더 없으며 간접적 하나에 의존해야한다. 또한 포함 파일 검색 경로 또는 포함 경로에 때때로 추가 될 것으로 예상되는 임의의 디렉토리에 config.h이라는 파일을 설치해야합니다. 너무 큰 충돌의 위험이 있습니다. 헤더 이름은 어느 정도는 그렇지만, 그러한 헤더가 정의하고 의존하는 매크로 이름의 의미는 더 큽니다.

결론 : Autotools config.h 파일은 이 아닌 빌드 된 결과를 사용하는 것이 아니라 연관된 프로젝트를 빌드하는 데 사용됩니다. 특히 이러한 프로젝트가 라이브러리이거나 라이브러리를 포함 할 경우 config.h은 라이브러리 자체 헤더 파일이나 라이브러리를 사용하여 호출하려는 코드에서 직접 사용하는 데는 사용법이 적합하지 않습니다. Autotools는 설치를위한 헤더를 사용자 정의하여 빌드 타임 시스템 구성을 기념 할 수있는 다양한 메커니즘을 제공합니다.


그렇다면 여러분이 묻는 라이브러리에 관해서는 어디에서 나옵니까? 내가 설명하는 문제는 코드 품질이 좋지 않음을 나타내는 것이므로 대안을 강구하는 것이 좋습니다. 프로젝트를 수정하기 위해 노력할 수있는 방법이 있지만, 특히 Autotools 초보자로서 시간을할만한 가치는 없을 것입니다.

관련 문제