정적/동적 라이브러리 둘 다 링크하기
하나의 프로그램에서 정적/동적 라이브러리를 동시에 사용하는 경우의 링크 방법이다.
정적(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가지 방법이 있었다.
- 첫번째 방법은 정적 라이브러리 링크를
-l<라이브러리_이름>
대신에 전체 경로(파일 이름 포함)를 명시하는 방법이다. - 두번째 방법은 아래 형태와 같이
-Wl,-Bstatic
이후에 정적 라이브러리들을 명시하고,-Wl,-Bdynamic
이후에 동적 라이브러리들을 명시하는 방법이다.-Wl,-Bstatic -l<정적_라이브러리1> -l<정적_라이브러리2> -Wl,-Bdynamic -l<동적_라이브러리1> -l<동적_라이브러리2>
물론
-Wl,-Bstatic
,-Wl,-Bdynamic
옵션의 순서는 중요하지 않고, 필요하면 여러 번 사용해도 된다.
결론
위와 같은 방법을 사용하여 기존처럼 회사 내부의 코드는 정적 라이브러리로 빌드하여 링크시키고, open source 등의 모듈들은 동적 라이브러리로 빌드하여 링크시켰더니, 링크도 잘 되었고 실행 시 동작도 문제가 없었다.
간단한 Makefile 팁인데 모르는 사람들이 많은 관계로 공유한다.