정적/동적 라이브러리 둘 다 링크하기

하나의 프로그램에서 정적/동적 라이브러리를 동시에 사용하는 경우의 링크 방법이다.

정적(static) 라이브러리 링크

정적 라이브러리의 링크는 Makefile에서 아래와 같이 링크시키면 된다. (이때 실제 라이브러리의 파일 이름은 lib<라이브러리_이름>.a 형태임)

-l<라이브러리_이름>

참고로 만약에 라이브러리 순서가 문제되는 경우에는, 아래 예와 같이 -Xlinker --start-group-Xlinker --end-group 사이에 라이브러리들을 넣으면 된다.

-Xlinker --start-group -l<라이브러리1> -l<라이브러리2> -l<라이브러리3> -Xlinker --end-group

동적(dynamic, shared) 라이브러리 링크

동적 라이브러리의 링크는 Makefile에서 아래와 같이 링크시키면 된다. (이때 실제 라이브러리의 파일 이름은 lib<라이브러리_이름>.so 형태임)

-l<라이브러리_이름>

정적/동적 라이브러리를 동시에 링크

위에서 보듯이 정적이나 동적 라이브러리를 링크하는 방법은 동일하게 -l<라이브러리_이름>을 명시하는 것이다. 그런데 하나의 프로그램에서 정적 라이브러리와 동적 라이브러리를 동시에 링크하려면 링크 에러가 발생할 수 있다.
회사 프로젝트에서 이런 경우가 있었는데, 이렇게 동시에는 링크가 안 되어서 하나로 통일(예를 들어 동적 라이브러리로 통일)해서 각 모듈을 빌드한 후 링크하고 방법을 사용하고 있었다. 그런데 이 방법을 사용하면 회사 내부 코드들이 so 파일로 빌드되어서 쉽게 누출이 된다는 문제점이 있었다.

그래서 하나의 프로그램에서 동시에 두 라이브러리 타입을 동시에 링크시키는 방법을 찾아보았고, 다음과 같은 2가지 방법이 있었다.

  1. 첫번째 방법은 정적 라이브러리 링크를 -l<라이브러리_이름> 대신에 전체 경로(파일 이름 포함)를 명시하는 방법이다.
  2. 두번째 방법은 아래 형태와 같이 -Wl,-Bstatic 이후에 정적 라이브러리들을 명시하고, -Wl,-Bdynamic 이후에 동적 라이브러리들을 명시하는 방법이다.
    -Wl,-Bstatic -l<정적_라이브러리1> -l<정적_라이브러리2> -Wl,-Bdynamic -l<동적_라이브러리1> -l<동적_라이브러리2>
    

    물론 -Wl,-Bstatic, -Wl,-Bdynamic 옵션의 순서는 중요하지 않고, 필요하면 여러 번 사용해도 된다.

결론

위와 같은 방법을 사용하여 기존처럼 회사 내부의 코드는 정적 라이브러리로 빌드하여 링크시키고, open source 등의 모듈들은 동적 라이브러리로 빌드하여 링크시켰더니, 링크도 잘 되었고 실행 시 동작도 문제가 없었다.
간단한 Makefile 팁인데 모르는 사람들이 많은 관계로 공유한다.

카테고리:

업데이트: