gpt4 book ai didi

c++ - 如何动态构建和链接 boost::regex 与隐藏的内联?

转载 作者:行者123 更新时间:2023-11-30 04:27:29 24 4
gpt4 key购买 nike

作为我的 (OSX) 项目的一部分,我正在将 boost::regex 构建为一个动态库。当我在没有 -fvisibility-inlines-hidden 的情况下构建和链接时,一切都按预期工作。

但是,要解决另一个外部依赖项中的错误,我需要打开此编译器开关。这样做会导致很多像这样的链接器错误

Undefined symbols for architecture x86_64:
"boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*,
std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<
char const*, std::string> > >, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::find()", referenced from:
bool boost::regex_search<__gnu_cxx::__normal_iterator<char const*,
std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<
char const*, std::string> > >, char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*,
std::string>, __gnu_cxx::__normal_iterator<char const*, std::string>,
boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>,
std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*,
std::string> > > >&, boost::basic_regex<char, boost::regex_traits<char,
boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags,
__gnu_cxx::__normal_iterator<char const*, std::string>) in Regex.o

当我尝试将 boost 链接到我的项目时(文件“Regex.o”是 boost dylib 的一部分)。据我了解Apple's documentation ,限制内联可见性应该只会导致每个动态库获取其自己的内联函数实例,但绝不会导致链接器错误。

似乎有一个相关的compiler bug for virtual methods , 但 perl_matcher::find()regex_search() 都不是虚方法。

有什么建议/想法吗?

$ clang --version
Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix

最佳答案

原来这是clang 3.1的编译器bug。 Boost 声明模板内联成员函数 perl_matcher<...>::find() (和其他人)作为 external ;只有链接到 boost dylib 的实例未标记为外部。因为它是内联的,所以 clang 3.1 使用 -fvisibility-inlines-hidden 从 dylib 的导出表中隐藏了这个实例。 .

这个bug似乎在当前的clang (3.2.x)主干中被修复了。在那之前,定义 BOOST_REGEX_NO_EXTERNAL_TEMPLATES解决此错误(如果可以接受在您的二进制文件中可能有这些内联函数的多个实例)。否则,修补 boost::regex 以显式导出 boost/regex/v4/instances.hpp 中定义的符号使用 __attribute__ ((visibility("default")))什么时候BOOST_REGEX_INSTANTIATE被定义也应该完成这项工作(参见 #define template 顶部的 instances.hpp hack)。

关于c++ - 如何动态构建和链接 boost::regex 与隐藏的内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10879284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com