하나의 static library를 여러번 사용하는 경우
      글쓴이: developerTUNA / 작성시간: 금, 2023/11/24 - 1:08오전    
  
  안녕하세요.
하나의 Base 라이브러리를 서로 다른 라이브러리에서 정적으로 링크해서 사용중입니다.
문제는 이러한 라이브러리들이 뭉쳤을때, 각자의 라이브러리 내의 Base 라이브러리를 참조하는 것이 아니라, 링크 순서에 따라서 참조하는 라이브러리가 다릅니다.
원하는 건 자기자신의 Base 라이브러리를 참조하고 싶은데, 어떻게 해야될지 잘 모르겠습니다.
검색어라도 알면 찾아볼텐데 검색어도 잘 모르겠습니다.
설명이 어려워서 이미지를 첨부합니다.
현재 함수 호출
MidFunc에서 main에서 포함한 BaseFunc를 호출해버린다...
원하는 함수 호출
MidFunc에서는 자신의 BaseFunc를 호출하고,
main 에서는 자신의 BaseFunc를 호출한다.
간단 테스트 코드입니다.
libBase의 헤더
Base.h
#ifndef BASE_H
#define BASE_H
 
int __attribute__((visibility("default"))) BaseFunc( void );
 
#endiflibBase는 1개지만, 호출 구분을 위해서 2개로 나눴습니다.
libBase_1.c
#include <stdio.h>
 
int g_nCall = 0;
int __attribute__((visibility("default"))) BaseFunc( void )
{
        printf("BaseLib 1 Call\n" );
        g_nCall++;
        printf("CallCount : %d\n", g_nCall );
        return 0;
}libBase_2.c
#include <stdio.h>
 
int g_nCall = 0;
int __attribute__((visibility("default"))) BaseFunc( void )
{
        printf("BaseLib 2 Call\n" );
        g_nCall++;
        printf("CallCount : %d\n", g_nCall );
        return 0;
}LibBase를 사용하는 Mid.h와 LibMid.c
Mid.h
#ifndef MID_H
#define MID_H
 
int __attribute__((visibility("default"))) MidFunc( void );
 
#endiflibMid.c
#include <stdio.h>
#include "Base.h"
 
int __attribute__((visibility("default"))) MidFunc( void )
{
        printf( "libMid Call\n" );
        BaseFunc( );
        return 0;
}LibBase, LibMid를 사용하는 main (라이브러리가 아니라 실행 파일)
main.c
#include <stdio.h>
 
#include "Mid.h"
#include "Base.h"
 
int main( void )
{
        printf( "main\n" );
 
        MidFunc( );
        BaseFunc( );
 
        return 0;
}위 프로젝트를 만들기위한 Makefile
all : libBase_1.a libBase_2.a libMid.a main
 
libBase_1.a : libBase_1.c
        gcc -c libBase_1.c -o libBase_1.o
        ar crT libBase_1.a libBase_1.o
 
libBase_2.a : libBase_2.c
        gcc -c libBase_2.c -o libBase_2.o
        ar crT libBase_2.a libBase_2.o
 
libMid.a : libBase_1.a
        gcc -c libMid.c -o libMid.o -L./ -lBase_1
        ar crT libMid.a libMid.o libBase_1.a
 
main : libMid.a libBase_2.a
        gcc main.c -L./ -lMid -lBase_2 -o main
 
clean :
        rm -rf *.a *.o main원하는 결과를 얻는게 불가능한건 아니지요?
컴파일 옵션 조절을 통해서 할수있을거 같은데요.
main 실행결과
main libMid Call BaseLib 1 Call CallCount : 1 BaseLib 1 Call CallCount : 2
원하는 실행 결과
main libMid Call BaseLib 1 Call CallCount : 1 BaseLib 2 Call CallCount : 1
설명이 어려우시다면 참조할만한 링크나, 검색어 정도라도 알려주시면 좋겠습니다 ㅠㅠ
Forums: 


C 에서 동일한 이름의 API를 visivility
C 에서 동일한 이름의 API를 visivility default 속성으로 빌드한다면, 원하는 걸 골라서 할 방법은 없을 겁니다. 동적 라이브러리의 경우에는 함수 포인트를 이용해서 잘 만들면 가능하지 않을까 싶고요. (호출할 함수 포인트를 그때 그때 원하는 library 로 바꿔치기 하면 되지 않을까..)
위의 경우에는 대표로 사용할 BaseFunc 외에 libMid 에서 call 할 BaseFunc 은.. libMid 안에서 visivility hidden으로 빌드 하셔야 할 것 같습니다.
https://stackoverflow.com
https://stackoverflow.com/questions/678254/what-should-i-do-if-two-libraries-provide-a-function-with-the-same-name-generati
이 글 한번 참고해 보시죠.
댓글 달기