<div dir="ltr"><div>Alright, thanks ! I think I wasn't explicit enough: the issue is specifically that header-only libraries are referenced in the `Libs` field of pkg-config files.<br></div><div><br></div><div>It makes sense to forward non-header-only dependencies of header-only libraries to their pkgconfig file. But what I'm seeing is that the header-only libraries themselves are being pulled into the `Libs` fields. And I'm pretty sure that doesn't make sense: for instance, the lexical_cast boost library is header only, so the `libboost_lexical_cast.so` file will never exist. Hence I would assume that writing "-lboost_lexical_cast" anywhere wouldn't make sense. Yet the `Libs` field of the generated pkgconfig files are filled with such references to header-only libraries.</div><div><br></div><div>And the result is that those pkgconfig files cannot be used by the pkg-config module for CMake. The linking step cannot complete if one of the referenced lib cannot be found. And `-lboost_lexical_cast`, along with many others, won't be found.</div><div><br></div><div style="text-align:justify">For reference, here is the pc file for libboost_program_options:</div><div style="text-align:justify"><br></div><div style="text-align:justify"><font face="monospace">Name: libboost-program-options<br>Version: 1.78.0<br>Description: The program_options library allows program developers to obtain program options, that is (name, value) pairs from the user, via conventional methods such as command line and config file<br>URL: <a href="https://github.com/boostorg/program_options">https://github.com/boostorg/program_options</a><br>Cflags: -I/home/michael/tintin/build-clang++-14/pkg/include -DBOOST_PROGRAM_OPTIONS_NO_LIB<br>Libs: -L/home/michael/tintin/build-clang++-14/pkg/lib -lboost_program_options -lboost_any -lboost_function -lboost_bind -lboost_type_index -lboost_lexical_cast -lboost_container -lboost_intrusive -lboost_numeric_conversion -lboost_range -lboost_array -lboost_iterator -lboost_conversion -lboost_fusion -lboost_function_types -lboost_tuple -lboost_typeof -lboost_optional -lboost_regex -licui18n -licuuc -lboost_concept_check -lboost_container_hash -lboost_detail -lboost_integer -lboost_mpl -lboost_utility -lboost_io -lboost_preprocessor -lboost_smart_ptr -lboost_move -lboost_core -lboost_throw_exception -lboost_assert -lboost_winapi -lboost_predef -lboost_type_traits -lboost_static_assert -lboost_config<br>Libs.private: -lboost_tokenizer -licudata -lpthread -ldl -lm<br><br>build2.metadata = 1<br><br>cc.type = cxx<br><br>cxx.importable_headers = \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/errors.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/detail/utf8_codecvt_facet.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/detail/value_semantic.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/detail/convert.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/detail/cmdline.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/detail/parsers.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/detail/config_file.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/value_semantic.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/option.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/cmdline.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/parsers.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/environment_iterator.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/variables_map.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/options_description.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/positional_options.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/version.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/eof_iterator.hpp \<br>/home/michael/tintin/build-clang++-14/pkg/include/boost/program_options/config.hpp</font><span style="font-family:monospace"><br></span></div><div style="text-align:justify"><font face="monospace"><br></font></div><div style="text-align:justify"><font face="arial, sans-serif">The `Libs` field includes tokens such as -lboost_bind, -lboost_lexical_cast, -lboost_core, which are header-only libraries. I don't think these tokens should be included.</font></div><div style="text-align:justify"><font face="arial, sans-serif"><br></font></div><div style="text-align:justify"><font face="arial, sans-serif">I have a workaround for that, which consists in using a script to prune all the "-l[insert header-only library name here]" from all the generated pc files. But I believe this is an issue.</font></div><div style="text-align:justify"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">El lun, 26 sept 2022 a las 15:30, Boris Kolpackov (<<a href="mailto:boris@codesynthesis.com">boris@codesynthesis.com</a>>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Michael Martín Moro via users <<a href="mailto:users@build2.org" target="_blank">users@build2.org</a>> writes:<br>
<br>
<br>
> They use `import intf_libs` or `import impl_libs` for importing all boost<br>
> dependencies... including header only ones.<br>
> <br>
> Seems to me like it resuls in pkgconfig files including a lot of extra<br>
> library to link that do not exist. You can check it out with<br>
> libboost-program-options or libboost-random: there are some -lboost_any<br>
> here and -lboost_config there that shouldn't be there.<br>
<br>
No, this is by design. We list header-only libraries in pkg-config files<br>
in order to load their own pkg-config files, which may (1) export some<br>
preprocessor options (-I, -D) or (2) link non-header-only libraries that<br>
they may depend upon (in build2 header-only libraries can depend on non-<br>
header-only).<br>
<br>
<br>
> It is my understanding that those header-only libraries should be imported<br>
> using `import libs` instead.<br>
<br>
There is nothing special about intf_libs/impl_libs/libs after import,<br>
they are just variable names. By convention we use intf_libs/impl_libs<br>
in libraries where it's required to separate interface (intf) and<br>
implementation (impl) libraries and we use libs in executables where<br>
such a separation isn't needed. For background, see:<br>
<br>
<a href="https://build2.org/build2/doc/build2-build-system-manual.xhtml#intro-lib" rel="noreferrer" target="_blank">https://build2.org/build2/doc/build2-build-system-manual.xhtml#intro-lib</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><b>Michaël Martín Moro</b><br>{ Epitech. Tek4 }<br>{ UCA Cadíz - Computer Engineering }<br></div>