2015-01-23 1 views
3

정적으로 링크 된 라이브러리에 버전 문자열을 넣고 링크 된 실행 파일의 이미지에 포함되도록 강요하고 이미지를 확인 (예 : strings)하고 버전 문자열을 볼 수 있습니다.정적 라이브러리의 문자열을 링크하는 실행 파일에 포함시킬 수 있습니까?

표준 C 및/또는 gcc에서 가능하며 실행 파일의 링크 옵션을 특별히 조정할 필요가 없습니까? 내가와 C++에서 이것을 달성하기 위해 관리했습니다 보인다

(그 정적 라이브러리를 사용하는 실행 파일의 연결을 조정하는 것은 .../잊기 쉬운 유지하는 지루한 일이기 때문에)

extern char const * that_version_string; 
static char const * const foo_that_version_string = that_version_string; 

라이브러리의 헤더 파일에 있습니다. 하지만 C는 컴파일하지 않습니다 : "non-const initializer"또는 이와 비슷한 것.

+1

정적으로 링크 된 라이브러리를 의미합니까? 그렇다면 링크 된 exe가 라이브러리 코드를 포함하므로 라이브러리 버전 문자열이 이미 파일에 포함됩니다. –

+0

@Peter M : 예, 정적으로 링크되었습니다. 연결된 exe는 모든 객체가 아닌 라이브러리의 참조 된/사용 된 객체 만 포함합니다. 이 버전 문자열이 아닌 모든 개체에 대해 해당 동작을 변경하고 싶지 않습니다. 예 : exe는 라이브러리에서 필요한 기능 만 포함해야합니다. – Zrin

+0

왜'const char * Version() {return "your_version_str";}'라이브러리에 간단히 추가하지 않으시겠습니까? (상수) 문자열은 라이브러리 객체 코드의 RO 데이터 섹션에 상주하며 함수는 호출 될 때마다 해당 문자열에 대한 포인터를 반환합니다. –

답변

1

라이브러리 foofooInit 라이브러리가 있다고 가정 해 봅시다.이 라이브러리는 이어야하며 라이브러리를 사용하려면이어야합니다. 그런 다음이 함수에 다음 코드를 입력하십시오.

char const * that_version_string = "Foo 1.0"; 
char const * this_version_string; 

void fooInit(void) 
{ 
    this_version_string = that_version_string; 

    // more initialization code ... 
} 

컴파일러가 할당을 최적화하지 않았 음을 확인하기 위해 라이브러리를 컴파일 할 때 어셈블리 코드를 확인하십시오. this_version_string은 잠재적으로 다른 곳에서 사용될 수있는 전역입니다.

+0

이것은 몇몇 프로젝트에서 작동 할 수있는 또 다른 아이디어를 제공합니다 : 각각의 라이브러리 헤더가 확장 될 수 있고 메인 실행 파일이'print_full_version()'함수에서 사용할 수있는'#define USED_STATIC_LIBRARIES'를 가지고 있습니다 ... 이것은 또한 작동 할 것입니다 헤더 전용 라이브러리. 여전히 실행 파일 측면에서 명시 적 공동 작업이 필요하지 않은 솔루션을 찾고 있는데 fooInit()와 같은 함수 없이도 작동합니다. – Zrin

+0

@Zrin Yup, 주 실행 파일의'print_full_version()'함수는 확실히 작동 할 것입니다. 함수를 호출 할 수있는 방법이 있어야한다고 생각합니다. '-v' 옵션, 또는 함수와 그것이 참조하는 모든 것을 최적화 할 수 있습니다. – user3386109

관련 문제