如何动态构建和链接带有隐藏内联的 boost::regex
How to dynamically build and link boost::regex with hidden inlines?
作为我(OSX)项目的一部分,我正在构建boost::regex作为一个动态库。当我在没有隐藏 -fvisibility-inline-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 的文档,限制内联可见性应该只会导致每个动态库获得自己的内联函数实例,但绝不会导致链接器错误。
虚拟方法似乎存在相关的编译器错误,但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 中的一个编译器错误。Boost 将模板内联成员函数perl_matcher<...>::find()
(和其他函数)声明为 external
;只有链接到 Boost Dylib 的实例不会标记为外部。因为它是内联的,所以 clang 3.1 使用 -fvisibility-inlines-hidden
从 dylib 的导出表中隐藏此实例。
似乎这个错误在当前的 clang (3.2.x) 主干中得到了修复。在此之前,定义BOOST_REGEX_NO_EXTERNAL_TEMPLATES
可以解决此错误(如果二进制文件中可能有多个这些内联函数的实例是可以接受的)。否则,修补 boost::regex 以在定义BOOST_REGEX_INSTANTIATE
时使用__attribute__ ((visibility("default")))
显式导出boost/regex/v4/instances.hpp
中定义的符号也应该完成这项工作(请参阅instances.hpp
顶部的#define template
黑客)。
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 此模式的C++RegEx
- 结构和双指针隐藏在其他结构中,多层混淆
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 参数包构造函数在类模板中隐藏用户定义的转换
- 如何等待窗口隐藏在Qt中?
- 如何使用类型别名从模板化类中隐藏模板列表
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- C++ std::regex 使用前瞻失败
- 名称隐藏对静态函数继承的实例使用
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 在 Linux 中使用 ioctl() 获取隐藏功能报告时,零字节消失
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 如何在 Omnet++ 5.6.1 中隐藏箭头?
- 在C++中隐藏键盘记录器的控制台窗口
- 从静态库使用时隐藏不透明结构的内容
- 隐藏用于聚合初始化的空基类
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- Qt中的包装连接方法隐藏了编译器所需的信息
- 如何动态构建和链接带有隐藏内联的 boost::regex