Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

check_library_exists cannot find snappy package correctly #1146

Open
ldeng-ustc opened this issue Sep 15, 2023 · 1 comment
Open

check_library_exists cannot find snappy package correctly #1146

ldeng-ustc opened this issue Sep 15, 2023 · 1 comment

Comments

@ldeng-ustc
Copy link

ldeng-ustc commented Sep 15, 2023

I manually compiled and installed snappy 1.10 from source, then I tried to use cmake to compile levelDB, but it still prompted that it could not find snappy_compress, and compression would not be performed at runtime. The cmake prompt is as follows:

-- Looking for snappy_compress in snappy
-- Looking for snappy_compress in snappy - not found

If I manually modify CMakeLists.txt and set HAVE_SNAPPY on line 42 to ON, the compilation can succeed, and the compression function can run normally.

The following is the output in CMakeError.log (I don’t know if this is related to the problem):

Determining if the function snappy_compress exists in the snappy failed with the following output:
Change Dir: /home/ldeng/open-source/leveldb/build/CMakeFiles/CMakeTmp

Run Build Command(s):/usr/bin/gmake -f Makefile cmTC_b0e82/fast && /usr/bin/gmake  -f CMakeFiles/cmTC_b0e82.dir/build.make CMakeFiles/cmTC_b0e82.dir/build
gmake[1]: Entering directory '/home/ldeng/open-source/leveldb/build/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_b0e82.dir/CheckFunctionExists.c.o
/usr/bin/cc   -DCHECK_FUNCTION_EXISTS=snappy_compress -std=c11 -o CMakeFiles/cmTC_b0e82.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.22/Modules/CheckFunctionExists.c
Linking C executable cmTC_b0e82
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b0e82.dir/link.txt --verbose=1
/usr/bin/cc  -DCHECK_FUNCTION_EXISTS=snappy_compress CMakeFiles/cmTC_b0e82.dir/CheckFunctionExists.c.o -o cmTC_b0e82  -lsnappy 
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::internal::WorkingMemory::WorkingMemory(unsigned long)':
snappy.cc:(.text+0x958): undefined reference to `std::allocator<char>::allocator()'
/usr/bin/ld: snappy.cc:(.text+0x987): undefined reference to `std::allocator<char>::~allocator()'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::internal::WorkingMemory::~WorkingMemory()':
snappy.cc:(.text+0xa0d): undefined reference to `std::allocator<char>::allocator()'
/usr/bin/ld: snappy.cc:(.text+0xa37): undefined reference to `std::allocator<char>::~allocator()'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::Uncompress(char const*, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
snappy.cc:(.text+0x206e): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::max_size() const'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::Compress(char const*, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
snappy.cc:(.text+0x2390): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::erase(unsigned long, unsigned long)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::CompressFromIOVec(iovec const*, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
snappy.cc:(.text+0x246d): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::erase(unsigned long, unsigned long)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::STLStringResizeUninitialized(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, unsigned long)':
snappy.cc:(.text._ZN6snappy28STLStringResizeUninitializedEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm[_ZN6snappy28STLStringResizeUninitializedEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm]+0x23): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::resize(unsigned long)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::string_as_array(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
snappy.cc:(.text._ZN6snappy15string_as_arrayEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN6snappy15string_as_arrayEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x27): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::empty() const'
/usr/bin/ld: snappy.cc:(.text._ZN6snappy15string_as_arrayEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN6snappy15string_as_arrayEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x3e): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::begin()'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::SnappySinkAllocator::Allocate(int)':
snappy.cc:(.text._ZN6snappy19SnappySinkAllocator8AllocateEi[_ZN6snappy19SnappySinkAllocator8AllocateEi]+0x32): undefined reference to `operator new[](unsigned long)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::SnappySinkAllocator::Deleter(void*, char const*, unsigned long)':
snappy.cc:(.text._ZN6snappy19SnappySinkAllocator7DeleterEPvPKcm[_ZN6snappy19SnappySinkAllocator7DeleterEPvPKcm]+0x27): undefined reference to `operator delete[](void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `__gnu_cxx::new_allocator<char>::allocate(unsigned long, void const*)':
snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv]+0x39): undefined reference to `std::__throw_bad_alloc()'
/usr/bin/ld: snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv]+0x45): undefined reference to `operator new(unsigned long)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `__gnu_cxx::new_allocator<char>::deallocate(char*, unsigned long)':
snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm[_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm]+0x20): undefined reference to `operator delete(void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `std::vector<snappy::SnappySinkAllocator::Datablock, std::allocator<snappy::SnappySinkAllocator::Datablock> >::_M_check_len(unsigned long, char const*) const':
snappy.cc:(.text._ZNKSt6vectorIN6snappy19SnappySinkAllocator9DatablockESaIS2_EE12_M_check_lenEmPKc[_ZNKSt6vectorIN6snappy19SnappySinkAllocator9DatablockESaIS2_EE12_M_check_lenEmPKc]+0x5f): undefined reference to `std::__throw_length_error(char const*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `std::pair<unsigned char const*, long> snappy::DecompressBranchless<char*>(unsigned char const*, unsigned char const*, long, char*, long)':
snappy.cc:(.text._ZN6snappy20DecompressBranchlessIPcEESt4pairIPKhlES4_S4_lT_l[_ZN6snappy20DecompressBranchlessIPcEESt4pairIPKhlES4_S4_lT_l]+0x4c8): undefined reference to `__cxa_guard_acquire'
/usr/bin/ld: snappy.cc:(.text._ZN6snappy20DecompressBranchlessIPcEESt4pairIPKhlES4_S4_lT_l[_ZN6snappy20DecompressBranchlessIPcEESt4pairIPKhlES4_S4_lT_l]+0x4fd): undefined reference to `__cxa_guard_release'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `__gnu_cxx::new_allocator<snappy::SnappySinkAllocator::Datablock>::deallocate(snappy::SnappySinkAllocator::Datablock*, unsigned long)':
snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE10deallocateEPS3_m[_ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE10deallocateEPS3_m]+0x20): undefined reference to `operator delete(void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `__gnu_cxx::new_allocator<snappy::SnappySinkAllocator::Datablock>::allocate(unsigned long, void const*)':
snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE8allocateEmPKv]+0x49): undefined reference to `std::__throw_bad_array_new_length()'
/usr/bin/ld: snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE8allocateEmPKv]+0x4e): undefined reference to `std::__throw_bad_alloc()'
/usr/bin/ld: snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIN6snappy19SnappySinkAllocator9DatablockEE8allocateEmPKv]+0x5e): undefined reference to `operator new(unsigned long)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `__gnu_cxx::new_allocator<char*>::deallocate(char**, unsigned long)':
snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIPcE10deallocateEPS1_m[_ZN9__gnu_cxx13new_allocatorIPcE10deallocateEPS1_m]+0x20): undefined reference to `operator delete(void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `std::vector<char*, std::allocator<char*> >::_M_check_len(unsigned long, char const*) const':
snappy.cc:(.text._ZNKSt6vectorIPcSaIS0_EE12_M_check_lenEmPKc[_ZNKSt6vectorIPcSaIS0_EE12_M_check_lenEmPKc]+0x5f): undefined reference to `std::__throw_length_error(char const*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `__gnu_cxx::new_allocator<char*>::allocate(unsigned long, void const*)':
snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIPcE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIPcE8allocateEmPKv]+0x49): undefined reference to `std::__throw_bad_array_new_length()'
/usr/bin/ld: snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIPcE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIPcE8allocateEmPKv]+0x4e): undefined reference to `std::__throw_bad_alloc()'
/usr/bin/ld: snappy.cc:(.text._ZN9__gnu_cxx13new_allocatorIPcE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorIPcE8allocateEmPKv]+0x5e): undefined reference to `operator new(unsigned long)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy.cc.o): in function `snappy::SnappyIOVecReader::~SnappyIOVecReader()':
snappy.cc:(.text._ZN6snappy17SnappyIOVecReaderD0Ev[_ZN6snappy17SnappyIOVecReaderD5Ev]+0x24): undefined reference to `operator delete(void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy-sinksource.cc.o): in function `snappy::Source::~Source()':
snappy-sinksource.cc:(.text+0x42): undefined reference to `operator delete(void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy-sinksource.cc.o): in function `snappy::Sink::~Sink()':
snappy-sinksource.cc:(.text+0x8a): undefined reference to `operator delete(void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy-sinksource.cc.o): in function `snappy::ByteArraySource::~ByteArraySource()':
snappy-sinksource.cc:(.text+0x18e): undefined reference to `operator delete(void*)'
/usr/bin/ld: /usr/local/lib/libsnappy.a(snappy-sinksource.cc.o): in function `snappy::UncheckedByteArraySink::~UncheckedByteArraySink()':
snappy-sinksource.cc:(.text+0x268): undefined reference to `operator delete(void*)'
collect2: error: ld returned 1 exit status
gmake[1]: *** [CMakeFiles/cmTC_b0e82.dir/build.make:99: cmTC_b0e82] Error 1
gmake[1]: Leaving directory '/home/ldeng/open-source/leveldb/build/CMakeFiles/CMakeTmp'
gmake: *** [Makefile:127: cmTC_b0e82/fast] Error 2
@daniel-meilak
Copy link

I'm having the same issue. I build both snappy and leveldb using FetchContent, and to solve this currently, I am setting HAVE_SNAPPY to true (something like this: set(HAVE_SNAPPY ON CACHE BOOL "" FORCE)), before building leveldb.

It seems to work however I assume that this is dependent on snappy building before leveldb to work.

Here is my CMakeLists.txt: CMakeLists.txt

I can see that check_library_exists is used to find snappy, however the LOCATION variable is simply set to "" which, I assume, means that it will only look in the default system locations for snappy, i.e. it has to be installed previously, and you must have install permissions.

Would love to know if there is a proper way to build both snappy & leveldb in my project and have them link correctly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants