【问题标题】:automake+libtool+c++ = very bloated interfaceautomake+libtool+c++ = 非常臃肿的界面
【发布时间】:2011-02-13 00:24:12
【问题描述】:

首先我有“include_HEADERS = 'my public headers'”和“libfoobar_la_SOURCES = 'private sources' 'private headers'”。一切皆好。它编译/安装/链接。但是当我做“nm -C my_instaed_lib.so" 我明白了:

00005be0 T yyget_debug(void*)
00005b00 T yyget_extra(void*)
00005bf0 T yyset_debug(int, void*)
00005bb0 T yyset_extra(FM4::LexImpl*, void*)
00005b40 T yyget_column(void*)
00005b10 T yyget_lineno(void*)
00006180 T yyset_column(int, void*)
000061e0 T yyset_lineno(int, void*)
...

这从未在任何标题中声明。

000091f0 T FM4::PrcImpl::CollectMacro()
000089d0 T FM4::PrcImpl::CollectQuote()
00008870 T FM4::PrcImpl::CollectComment()
00009350 T FM4::PrcImpl::Collect()
000093f0 T FM4::PrcImpl::Process()
00008700 T FM4::PrcImpl::PrcImpl(FM4::Processor*)
00008590 T FM4::PrcImpl::PrcImpl(FM4::Processor*)
00009970 W FM4::PrcImpl::~PrcImpl()
00009a00 W FM4::PrcImpl::~PrcImpl()
...

这在私人未安装的标题中。

我阅读了两次 automake/libtool 手册,但我不知道如何从界面中去除这些废话? 或者什么可以将这些废话暴露给公共 api。如何控制导出到公共 api 的内容?

【问题讨论】:

  • 你用 flex/lex 做了什么?
  • 是的。可重入弹性词法分析器,但未在任何标头中声明。

标签: c++ automake libtool


【解决方案1】:

查找 libtool 选项 -export-symbols。给它一个要导出的符号列表。默认情况下,libtool 会导出所有符号。

【讨论】:

    【解决方案2】:

    如果您喜欢冒险,并且可以确定您正在使用足够新的 GCC 进行编译(我认为 ≥4.2 是良好支持所必需的),visibility 可以提供帮助。

    限制默认可见性 (-fvisibility=hidden) 并使用 __attribute__((visibility("default"))) 明确标记要导出的函数。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 2011-03-18
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多