Visual Studio可以生成静态库,可以删除符号吗?

时间:2011-01-17 12:35:07

标签: c++ visual-studio-2008 static-libraries symbols

我将这个问题分为三部分:

  1. 我想在其符号上生成一个静态库并剥离。 (调试信息已包含在内) 类似于linux中的strip命令。可以吗?

  2. windows env中是否有与Linux中的 nm 工具相同的工具?

  3. 使用VS2008创建静态库时。是否可以定义一个脚本,该脚本将排除一些生成的.obj文件从构建中移出静态库? 可以动态吗?我的意思是我在脚本中定义了编译模式,这将导致特定目标文件从构建中排除

4 个答案:

答案 0 :(得分:3)

如果您认为不应该看到任何内容,请尝试使用“static”关键字声明它。这告诉编译器只能访问当前模块。

答案 1 :(得分:2)

在某些情况下,除了少量“导出”的公共符号之外,能够删除所有符号是很方便的,但这并不可行。

静态库只不过是.obj文件的集合。内部依赖关系尚未解决,直到链接时才会解析。

例如,如果.lib由foo.obj和bar.obj组成,并且在foo.obj中调用bar.obj中定义的函数,则该符号必须在链接时可用,即使没有在图书馆外应该能够看到它。

因此,您不能剥离符号(可能除了文件范围的静态符号)。即使是受保护或私有的类方法(在C ++中也是如此)将存在于符号表中,因为可见性的强制执行是编译时问题,而不是链接时问题。

相比之下,动态库是一个已经链接的独立二进制文件。从foo.obj到bar.obj的引用已经解决。因此,除了必须导出的符号之外,DLL可以被剥离符号(甚至可以重命名或用序号替换)。

如果您的DLL公开了一个简单的C API,那么您已经完成了设置。但是如果你想公开一个C ++类,你可能最终会导出它的所有方法,甚至是受保护的和私有的方法(因为在外部应用程序中内联可能会导致直接调用私有方法)。

答案 2 :(得分:1)

  1. 不,您认为静态库的用户如何在不知道他们使用的符号在哪里定义的情况下链接到它?
  2. 是的,试试DUMPBIN实用程序。
  3. 嗯,是的。您可以使用LIB
  4. 运行/REMOVE:foo实用程序

    那就是说,我认为你做的事情要么不值得做,要么比删除库成员要简单得多。

答案 3 :(得分:0)

我一直在VS2010生成的.obj文件中找到某些(但不是全部)静态函数的名称。有趣的是,它们在我的Release .obj文件中可见,但不在Debug .obj文件中可见。我只是使用cygwin字符串来执行搜索:

$ strings myObjectFile.obj | grep myStaticFunctionName

我将其追溯到“整个程序优化=是”设置(“/ GL”)。当我将其切换为“否”时,不再显示功能名称。

更新:作为后续测试,我在vim中打开了“cleansed”myObjectFile.obj,我仍然可以找到它们(使用:set encoding = utf-8或:set encoding = latin1)。我不确定为什么字符串会丢失匹配项。哦,好吧。