하나의 static library를 여러번 사용하는 경우

developerTUNA의 이미지

안녕하세요.

하나의 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

설명이 어려우시다면 참조할만한 링크나, 검색어 정도라도 알려주시면 좋겠습니다 ㅠㅠ

File attachments: 
첨부파일 크기
Image icon asIs.jpg127.84 KB
Image icon toBe.jpg125.79 KB
김정균의 이미지

C 에서 동일한 이름의 API를 visivility default 속성으로 빌드한다면, 원하는 걸 골라서 할 방법은 없을 겁니다. 동적 라이브러리의 경우에는 함수 포인트를 이용해서 잘 만들면 가능하지 않을까 싶고요. (호출할 함수 포인트를 그때 그때 원하는 library 로 바꿔치기 하면 되지 않을까..)

위의 경우에는 대표로 사용할 BaseFunc 외에 libMid 에서 call 할 BaseFunc 은.. libMid 안에서 visivility hidden으로 빌드 하셔야 할 것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.