FindPkgConfig: Fails on non-system paths in LIBRARY_PATH
I have a separate development environment with privately compiled gcc and certain libraries. Lately I stumbled across an issue where CMake's PkgConfig uses the system-wide library, instead of from my private environment, though I think I have done everything according to the documentation.
The library in my case is x265
. The experiment uses the latest snapshot of CMake (3.20.20210504-g576a070
) from the repository. Let's assume my environment is at /home/SpaceX/gcc-env
. The following paths are set in the system's environment:
PATH: /home/SpaceX/gcc-env/bin ... LD_LIBRARY_PATH: /home/SpaceX/gcc-env/lib LIBRARY_PATH: /home/SpaceX/gcc-env/lib PKG_CONFIG_PATH: /home/SpaceX/gcc-env/lib/pkgconfig C_INCLUDE_PATH: /home/SpaceX/gcc-env/include CPLUS_INCLUDE_PATH: /home/SpaceX/gcc-env/include
pkg-config
correctly finds information about x265
:
$ pkg-config --variable=prefix x265 /home/SpaceX/gcc-env
Let's consider the following CMakeLists.txt
:
cmake_minimum_required(VERSION 3.20) project(mwe) add_executable(mwe mwe.cpp) find_package(PkgConfig REQUIRED) pkg_check_modules(X265 REQUIRED IMPORTED_TARGET x265) target_include_directories(mwe PRIVATE ${X265_INCLUDE_DIRS} ) target_compile_options(mwe PRIVATE ${X265_CFLAGS_OTHER} ) target_link_libraries(mwe PkgConfig::X265 ) target_link_options(mwe PRIVATE ${X265_LDFLAGS_OTHER} ) message(STATUS "X265_FOUND = ${X265_FOUND}") message(STATUS "X265_VERSION = ${X265_VERSION}") message(STATUS "X265_PREFIX = ${X265_PREFIX}") message(STATUS "X265_INCLUDEDIR = ${X265_INCLUDEDIR}") message(STATUS "X265_LIBDIR = ${X265_LIBDIR}")
The following command
cmake -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_C_COMPILER=gcc \ -DCMAKE_CXX_COMPILER=g++ \ -H. -Bbuild -G Ninja
will output
$ cmake --version cmake version 3.20.20210504-g576a070 $ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -H. -Bbuild -G Ninja -- The C compiler identification is GNU 11.1.1 -- The CXX compiler identification is GNU 11.1.1 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /home/SpaceX/gcc-env/bin/gcc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /home/SpaceX/gcc-env/bin/g++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Found PkgConfig: /usr/bin/pkg-config (found version "1.7.3") -- Checking for module 'x265' -- Found x265, version 3.5 -- X265_FOUND = 1 -- X265_VERSION = 3.5 -- X265_PREFIX = /home/SpaceX/gcc-env -- X265_INCLUDEDIR = /home/SpaceX/gcc-env/include -- X265_LIBDIR = /home/SpaceX/gcc-env/lib -- X265_MODULE_NAME = x265
So far everything is alright. However, the compilation produces an unexpected result:
$ cmake --build build --verbose --config Debug --target all [1/2] /home/SpaceX/gcc-env/bin/g++ -g -MD -MT CMakeFiles/mwe.dir/mwe.cpp.o -MF CMakeFiles/mwe.dir/mwe.cpp.o.d -o CMakeFiles/mwe.dir/mwe.cpp.o -c ../mwe.cpp [2/2] : && /home/SpaceX/gcc-env/bin/g++ -g CMakeFiles/mwe.dir/mwe.cpp.o -o mwe /usr/lib/libx265.so && :
I.e. the generated linker command for some reason uses a full path to the system library: /usr/lib/libx265.so
. Not even simply libx265.so
, but an exact path nobody asked about. The library in question in fact exists at the X265_LIBDIR
:
$ ls -lA /home/SpaceX/gcc-env/lib/*x265* -rw-r--r-- 1 SpaceX SpaceX 12359618 мая 3 21:43 /home/SpaceX/gcc-env/lib/libx265.a lrwxrwxrwx 1 SpaceX SpaceX 14 мая 3 20:51 /home/SpaceX/gcc-env/lib/libx265.so -> libx265.so.200* -rwxr-xr-x 1 SpaceX SpaceX 8022848 мая 3 21:43 /home/SpaceX/gcc-env/lib/libx265.so.200*
I attached the MWE with x265.pc
for reference.
mwe.tar.xz