Closed uemanon closed 2 years ago
Firstly, cplus_demangle_v3_callback
is from demangle.h
which is provided by libiberty
.
Secondly, folly use __has_include(<demangle.h>)
to detect if it has libiberty rather than relying on FOUND_LIBIBERTY
which is checked by cmake. For more details, see following code
#if __has_include(<demangle.h>)
static constexpr auto liberty_demangle = cplus_demangle_v3_callback;
That means, if you had demangle.h
in gcc's default search path, and cmake didn't found libiberty, therefore libiberty.a would't be linked, so you would have that's error message.
As for why cmake can't find libiberty although demangle.h alreay exists. We need check https://github.com/facebook/folly/blob/main/CMake/FindLibiberty.cmake#L15-L29
find_path(LIBIBERTY_INCLUDE_DIR NAMES libiberty.h PATH_SUFFIXES libiberty)
mark_as_advanced(LIBIBERTY_INCLUDE_DIR)
find_library(LIBIBERTY_LIBRARY NAMES iberty)
mark_as_advanced(LIBIBERTY_LIBRARY)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
LIBIBERTY
REQUIRED_VARS LIBIBERTY_LIBRARY LIBIBERTY_INCLUDE_DIR)
if(LIBIBERTY_FOUND)
set(LIBIBERTY_LIBRARIES ${LIBIBERTY_LIBRARY})
set(LIBIBERTY_INCLUDE_DIRS ${LIBIBERTY_INCLUDE_DIR})
endif()
From your logs, libiberty.a is located at /usr/lib64/libiberty.a
, I guesse the path /usr/lib64/
is not in find_library
's lookup list. The search process of find_library is in https://cmake.org/cmake/help/latest/command/find_library.html.
The easiest way to fix it is deleting demangle.h
from your system include path, perhaps /usr/include/demangle.h, If you don't need folly's demangle
. Otherwise, you need to give find_library some hints so that it can find libiberty correctly.
I had checked my environment which is in ubuntu, and I found that libiberty.h
is under /usr/include/libiberty
, not in /usr/include
directly.
By checking FindLibiberty.cmake
again, we can see that find_path
used PATH_SUFFIXES
libiberty
.
Therefore, libiberty.h
will not be found when it's installed at /usr/include/libiberty.h
.
PATH_SUFFIXES
are "additional subdirectories to check below each directory location otherwise considered" so AFAIU they don't exclude the original location.
PATH_SUFFIXES
are "additional subdirectories to check below each directory location otherwise considered" so AFAIU they don't exclude the original location.
@dg0yt All right, we just need add some logs for LIBIBERTY_INCLUDE_DIR
LIBIBERTY_LIBRARY
in FindLibiberty.cmake.
The easiest way to fix it is deleting demangle.h from your system include path, perhaps /usr/include/demangle.h, If you don't need folly's demangle. Otherwise, you need to give find_library some hints so that it can find libiberty correctly.
Thanks for your reply.
By removing /usr/include/demangle.h
it does make build successful, but for both moving the location of /usr/lib64/libiberty.a
or setting CMAKE_LIBRARY_PATH
to /usr/lib64
in manifest mode, it doesn't work, perhaps I need to diagnose other causes.
PATH_SUFFIXES
are "additional subdirectories to check below each directory location otherwise considered" so AFAIU they don't exclude the original location.@dg0yt All right, we just need add some logs for
LIBIBERTY_INCLUDE_DIR
LIBIBERTY_LIBRARY
in FindLibiberty.cmake.
IMO FindLibiberty.cmake
is doing enough with find_package_handle_standard_args
, but the rest of the folly build system generally doesn't seem to do enough with find_package
success or failure. For this package, there is
find_package(Libiberty)
list(APPEND FOLLY_LINK_LIBRARIES ${LIBIBERTY_LIBRARIES})
list(APPEND FOLLY_INCLUDE_DIRECTORIES ${LIBIBERTY_INCLUDE_DIRS})
Libiberty
is always optional.find_package(Libiberty)
, i.e. Libiberty_FOUND
, seems to have no other effect on the build system, such as the set of sources, or macro definitions (e.g. a FOOLY_WITH_LIBIBERTY
).
IMO this is the reason why there are problems with not finding symbols when the library wasn't found but the header is in a standard include path.
And this explains why this particular linking issue seems to have many hits with folly on Google.
Host Environment
Linux fedora 5.15.11-200.fc35.x86_64 #1 SMP Wed Dec 22 15:41:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
c++ (GCC) 11.3.1 20220421 (Red Hat 11.3.1-2)
To Reproduce Steps to reproduce the behavior:
./vcpkg install folly
Failure logs vcpkg-tool version: 2022-05-05-67e17c1782801cf481be9ac0b3765dff3e4bdeb8 vcpkg-scripts version: 8e1f46de1 2022-06-10 (3 days ago)
here is part of log at path
.../vcpkg/buildtrees/folly/install-x64-linux-dbg-out.log
:Additional context I searched for this and checked the location of the libiberty installation, including the header file
/usr/include/libiberty.h
and the static library/usr/lib64/libiberty.a
. How can I fix it?