아래와 같이 같은 이름의 전역변수를 공유하는 소스와 라이브러리가 있다.

 

main.c

#include <stdio.h>

int gVal;

int main(void)
{
	gVal = 0;
    
    SetgVal();
    
	printf("gVal : %d \n", gVal);
    
    return 0;
}

 

lib_main.c

#include <stdio.h>

int gVal;

int Func1(void)
{
	// Function
}

lib_func.c

#include <stdio.h>

extern int gVal;

int SetgVal()
{
	gVal = 100;
    
    return 1;
}

 

 

처음은 위 라이브러리를 정적라이브러리로 만들었다.

그러자, 소스에 링크를 시키니 "gVal" 이라는 전역변수가 겹쳐 컴파일이 되지 않는다.

그렇다고 lib_main.c 의 gVal을 extern 으로 선언할 경우 이번엔 라이브러리 자체를 컴파일 할 수 없게 된다. 

실제가 없는 변수를 extern 하고 있기 때문이다.

 

위 문제는 라이브러리를 동적으로 컴파일 하면 해결된다.

 

동적 라이브러리는 프로세스 동작 중 해당 함수를 호출할 경우에만 코드를 호출하기 때문에, 소스 컴파일시에도 중복선언으로 걸릴 일이 없기 때문이다.

 

 

 

 

'노트' 카테고리의 다른 글

fork와 SIGINT  (0) 2022.07.08

+ Recent posts