微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Abseil的麻烦随机

如何解决Abseil的麻烦随机

我试图将ABSEIL random 中的某些功能与Cmake一起使用。 (例如 absl :: Uniform()) 在instruction中,我做到了一切。和所有的工作。然后我想要更多,并开始测试 absl :: Uniform()ABSEIL RANDOM

我的hello_word.cc就像

#include <iostream>
#include <string>
#include <vector>
#include "absl/strings/str_join.h"
#include "absl/random/random.h"


int main() {
  std::vector<std::string> v = {"foo","bar","baz"};
  std::string s = absl::StrJoin(v,"-");

  absl::BitGen bitgen;
  double fraction = absl::Uniform(bitgen,1.0);


  std::cout << "Joined string: " << s << "\n";
}

和CmakeLists.txt是:

cmake_minimum_required(VERSION 3.5)
project(my_project)

# Pick the C++ standard to compile with.
# Abseil currently supports C++11,C++14,and C++17.
set(CMAKE_CXX_STANDARD 11)

add_subdirectory(abseil-cpp)

add_executable(hello_world hello_world.cc)

target_link_libraries(hello_world absl::base absl::synchronization absl::strings)

architecture

然后cmake给出:

ERROR

/usr/bin/ld: CMakeFiles/hello_world.dir/hello_world.cc.o: in function `absl::random_internal::randen_engine<unsigned long>::randen_engine<absl::random_internal::NonsecureURBGBase<absl::random_internal::randen_engine<unsigned long> >::Seeder&,void>(absl::random_internal::NonsecureURBGBase<absl::random_internal::randen_engine<unsigned long> >::Seeder&)':
hello_world.cc:(.text._ZN4absl15random_internal13randen_engineImEC2IRNS0_17NonsecureURBGBaseIS2_E6SeederEvEEOT_[_ZN4absl15random_internal13randen_engineImEC5IRNS0_17NonsecureURBGBaseIS2_E6SeederEvEEOT_]+0x22): undefined reference to `absl::random_internal::Randen::Randen()'
/usr/bin/ld: CMakeFiles/hello_world.dir/hello_world.cc.o: in function `void absl::random_internal::Randen::Absorb<unsigned int,60ul,unsigned long,32ul>(unsigned int const (&) [60ul],unsigned long (&) [32ul]) const':
hello_world.cc:(.text._ZNK4absl15random_internal6Randen6AbsorbIjLm60EmLm32EEEvRAT0__KT_RAT2__T1_[_ZNK4absl15random_internal6Randen6AbsorbIjLm60EmLm32EEEvRAT0__KT_RAT2__T1_]+0x33): undefined reference to `absl::random_internal::RandenHwAes::Absorb(void const*,void*)'
/usr/bin/ld: hello_world.cc:(.text._ZNK4absl15random_internal6Randen6AbsorbIjLm60EmLm32EEEvRAT0__KT_RAT2__T1_[_ZNK4absl15random_internal6Randen6AbsorbIjLm60EmLm32EEEvRAT0__KT_RAT2__T1_]+0x48): undefined reference to `absl::random_internal::RandenSlow::Absorb(void const*,void*)'
/usr/bin/ld: CMakeFiles/hello_world.dir/hello_world.cc.o: in function `void absl::random_internal::NonsecureURBGBase<absl::random_internal::randen_engine<unsigned long> >::Seeder::generate_impl<unsigned int*>(std::integral_constant<bool,true>,unsigned int*,unsigned int*)':
hello_world.cc:(.text._ZN4absl15random_internal17NonsecureURBGBaseINS0_13randen_engineImEEE6Seeder13generate_implIPjEEvSt17integral_constantIbLb1EET_SA_[_ZN4absl15random_internal17NonsecureURBGBaseINS0_13randen_engineImEEE6Seeder13generate_implIPjEEvSt17integral_constantIbLb1EET_SA_]+0x80): undefined reference to `absl::random_internal::RandenPool<unsigned int>::Fill(absl::Span<unsigned int>)'
/usr/bin/ld: CMakeFiles/hello_world.dir/hello_world.cc.o: in function `void absl::random_internal::Randen::Generate<unsigned long,32ul>(unsigned long (&) [32ul]) const':
hello_world.cc:(.text._ZNK4absl15random_internal6Randen8GenerateImLm32EEEvRAT0__T_[_ZNK4absl15random_internal6Randen8GenerateImLm32EEEvRAT0__T_]+0x32): undefined reference to `absl::random_internal::RandenHwAes::Generate(void const*,void*)'
/usr/bin/ld: hello_world.cc:(.text._ZNK4absl15random_internal6Randen8GenerateImLm32EEEvRAT0__T_[_ZNK4absl15random_internal6Randen8GenerateImLm32EEEvRAT0__T_]+0x4a): undefined reference to `absl::random_internal::RandenSlow::Generate(void const*,void*)'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/hello_world.dir/build.make:104: hello_world] Error 1
make[2]: *** [CMakeFiles/Makefile2:581: CMakeFiles/hello_world.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:588: CMakeFiles/hello_world.dir/rule] Error 2
make: *** [Makefile:164: hello_world] Error 2

还有问题: 如何使其运作? 预先谢谢你。

解决方法

谢谢。

我还没见过here “可用的Abseil CMake公开目标” ,因此, absl :: random_random

CMakeLists.txt应该类似于:

cmake_minimum_required(VERSION 3.5)
project(my_project)

# Pick the C++ standard to compile with.
# Abseil currently supports C++11,C++14,and C++17.
set(CMAKE_CXX_STANDARD 11)

add_subdirectory(abseil-cpp)

add_executable(hello_world hello_world.cc)

target_link_libraries(hello_world absl::base absl::synchronization absl::strings absl::random_random)


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。