동적 라이브러리 링크

필자의 지식이 짧아 일단 아는 것만 써보았다.
이보다는 더 좋은 방법이 있을것이라 확신한다.
추후 시간이 생겨 개선할 수 있으면 개선할 예정이다.

현재 하위 모듈에서 컴파일하여 최상위 모듈에서 링크하는 프로젝트 구조를 사용하고 있다.
문제는 하위 모듈에서 동적 라이브러리를 사용하는 경우이다.

이 경우 두 가지의 링킹방법을 사용할 수 있다.
1. 하위 모듈에서 목적파일을 만들 때 동적라이브러리 정보를 함께 넣어주거나 (ld의 -l 옵션)
2. 최상위 모듈에 동적라이브러리 정보를 전달하여, 최종 링크시에 이를 이용하면 된다. (ld의 -l 옵션)

문제는 1의 방법은 목적파일로 결과물이 나오는 형태이기 때문에 -l 옵션을 사용하기가 다소 까다로운 점이다.
-l 옵션을 사용할 때, 라이브러리의 위치를 -L로 일일이 지정해주어야 한다.
N개의 -l 옵션이 있는 경우 N개의 -L 옵션을 사용해야 한다.

2의 방법은 실행파일을 만드는 경우기 때문에 -L 옵션을 하나만 지정해주어도 모든 -l 옵션에 적용된다.
다만 경우에 따라 링킹이 안되는 경우가 있는데, 이 경우에는 LD_LIBRARY_PATH에 -L 옵션으로 지정했던 라이브러리 경로를 지정해주어야 한다.
그렇지 않으면 다음과 같은 참사를 볼 수 있다.

hooni@hooni-laptop:~/Project/hooni_AiO$ ./program 
./program: error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory
hooni@hooni-laptop:~/Project/hooni_AiO$ ldd program 
./program: /usr/lib/x86_64-linux-gnu/libQt5Core.so.5: version `Qt_5.11' not found (required by ./program)
	linux-vdso.so.1 (0x00007ffe2f57f000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f17ef4d1000)
	libmodbus.so.5 => /usr/lib/x86_64-linux-gnu/libmodbus.so.5 (0x00007f17ef2c7000)
	libQt5Widgets.so.5 => not found
	libQt5Gui.so.5 => not found
	libQt5Sql.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Sql.so.5 (0x00007f17ef07e000)
	libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f17ee933000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f17ee714000)
	libmariadbclient.so.18 => /usr/lib/x86_64-linux-gnu/libmariadbclient.so.18 (0x00007f17ee131000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f17edda8000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f17edb90000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f17ed79f000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f17ed582000)
	libicui18n.so.60 => /usr/lib/x86_64-linux-gnu/libicui18n.so.60 (0x00007f17ed0e1000)
	libicuuc.so.60 => /usr/lib/x86_64-linux-gnu/libicuuc.so.60 (0x00007f17ecd2a000)
	libdouble-conversion.so.1 => /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1 (0x00007f17ecb19000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f17ec915000)
	libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f17ec5ff000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f17ec261000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f17ef8ee000)
	libicudata.so.60 => /usr/lib/x86_64-linux-gnu/libicudata.so.60 (0x00007f17ea6b8000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f17ea446000)

Hits: 57

댓글 남기기