pkg-config가 언제/왜 라이브러리 링크 경로를 반환하지 않습니까?

pkg-config가 언제/왜 라이브러리 링크 경로를 반환하지 않습니까?

나는 pkg-config내 것을 원한다파일 생성링크 경로 찾기libspa-0.2.

나는 pkg-config --libs libspa-0.2아무것도 반환되지 않은 것을 관찰했습니다.

pkg-config단순화를 위해 쉘에서 직접 실행하여 문제를 설명 하겠습니다 .파일 생성.

$ uname -a
Linux MY_LINUX_PC 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$
$ sudo apt-get install -y libspa-0.2-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  libwebrtc-audio-processing1
Use 'sudo apt autoremove' to remove it.
Suggested packages:
  pipewire-doc
The following NEW packages will be installed:
  libspa-0.2-dev
0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
Need to get 0 B/81.7 kB of archives.
After this operation, 625 kB of additional disk space will be used.
Selecting previously unselected package libspa-0.2-dev:amd64.
(Reading database ... 34966 files and directories currently installed.)
Preparing to unpack .../libspa-0.2-dev_0.3.48-1ubuntu3_amd64.deb ...
Unpacking libspa-0.2-dev:amd64 (0.3.48-1ubuntu3) ...
Setting up libspa-0.2-dev:amd64 (0.3.48-1ubuntu3) ...
$
$ pkg-config --libs libspa-0.2

$

이상하게도 pkg-config신고를 요청하면 예상대로 작동합니다.libspa-0.2구성:

$ pkg-config --cflags libspa-0.2
-D_REENTRANT -I/usr/include/spa-0.2
$

내용은 이렇습니다libspa-0.2.pc:

$ cat /usr/lib/x86_64-linux-gnu/pkgconfig/libspa-0.2.pc
prefix=/usr
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include

plugindir=${libdir}/spa-0.2

Name: libspa
Description: Simple Plugin API
Version: 0.2
Cflags: -I${includedir}/spa-0.2 -D_REENTRANT
$

...그래서 나는 pkg-config --libs libspa-0.2그런 것을 반환 하려고 합니다 /usr/lib/x86_64-linux-gnu.

pkg-config --libs libspa-0.2빈 문자열이 반환되는 이유는 무엇입니까 ?

지식이 풍부한 답변자가 다양한 파일의 내용과 간의 관계를 설명해 주시면 pkg-config감사하겠습니다 apt-get..pc

특히 다음과 관련된 문제/관찰된 동작을 이해하고 싶습니다.libspa-0.2-dev, 하지만 일반화가 있다면 저도 배우고 싶습니다.


고쳐 쓰다: 이상합니다. pkg-config라이브러리 링크 경로의 내용을 (지능적으로) 형식화/제거한 것 같습니다. 내용은 이렇습니다라이브러리 파일-- 사전 설치된 것(이것은 내가 엉망으로 만든 모든 것을 배제해야 합니다):

$ cat /usr/lib/x86_64-linux-gnu/pkgconfig/zlib.pc
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
sharedlibdir=${libdir}
includedir=${prefix}/include

Name: zlib
Description: zlib compression library
Version: 1.2.11

Requires:
Libs: -L${libdir} -L${sharedlibdir} -lz
Cflags: -I${includedir}
$

...그리고 이것이 pkg-config보고된 라이브러리 링크 경로입니다:

$ pkg-config --libs zlib
-lz
$

...즉, 그 부분을 제거하는 것 같습니다 -L${libdir} -L${sharedlibdir}.

적어도 동작은 일관적입니다. 이는 아마도 "문제"가 아니라는 것을 의미하지만 pkg-config이것이 왜 수행되는지에 대한 이론적 근거를 알 수 없습니다: 라이브러리 링크 경로, 즉 -L콘텐츠를 제거하는 시기와 이유는 무엇입니까?

답변1

pkg-config --libs libspa-0.2빈 문자열이 반환되는 이유는 무엇입니까 ?

libspa-0.2헤더 전용 패키지이므로 라이브러리를 제공하지 않습니다. 이것이 해당 .pc파일에 지정된 항목이 없는 이유입니다 Libs.

-L라이브러리 링크 경로(예: 콘텐츠) 는 언제, 왜 제거되나요 ?

pkg-config컴파일러에 알려진 매개변수를 제거합니다. 시스템에서 /usr/lib/x86_64-linux-gnu이는 기본 라이브러리 경로이고 컴파일러는 이를 알고 있으므로 options 를 사용하여 이를 지정할 필요가 없습니다 -L. 이 동작은 다음 --keep-system-libs옵션을 사용하여 비활성화할 수 있습니다(적어도 시스템에서 사용하는 pkgconf구현을 통해).pkgconfig

$ pkg-config --keep-system-libs --libs zlib
-L/usr/lib/x86_64-linux-gnu -lz

하지만 여기에는 실제로 필요한 -L옵션 만 포함되어 있으므로 -l표시되지 않습니다 libspa-0.2.

$ pkg-config --keep-system-libs --libs libspa-0.2

(동등한 플래그 CFLAGS, 이 있습니다 --keep-system-cflags.)

관련 정보