하나의 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 ); #endif
libBase는 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 ); #endif
libMid.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
이 글 한번 참고해 보시죠.
댓글 달기