部分外部联动

时间:2014-06-18 15:10:07

标签: c++ visual-c++ visual-studio-2012

我有以下问题需要处理:

  • 有一个外部组件被编译成.lib文件以进行静态链接
  • 外部组件需要特定的功能/操作员界面(即该功能必须存在于另一个编译单元中)
  • 我不希望此功能可由不在外部组件中的代码访问
  • 我没有对这个特定功能接口的任何控制(或访问外部组件源代码的任何部分),它是全局范围内的给定功能

有没有办法实现这个目标? 如果重要,编译器为VC++ 2012

修改

  • 输出二进制文件应该是单个的,因此DLL和类似的操作不会。
  • 是否可以将符号可见性限制在单个.lib中的.obj文件中,而不是限制在其他.libs中?如果可能的话,我会将函数编译成.lib并用外部.lib重新打包。

3 个答案:

答案 0 :(得分:1)

编译静态lib及其应该用于DLL的接口的实现。

需要注意的事项:

  • dllexport info:这是附加到目标代码,为了从DLL导出它你可能要么直接搞乱它或使用dllexported包装函数。
  • 运行时:如果DLL和最终程序都静态链接运行时,则在两者之间传输内存会导致问题。如果两者都使用DLL运行时,你应该没问题。当然,这也会影响调试版本,这会为运行时添加另一种可能的变体。

答案 1 :(得分:1)

这可能无法直接实现。根据定义,静态库不进行链接,而只是为可执行二进制文件提供构建块,因此没有必要公开仅由静态库使用的符号。静态库只是不“消耗”符号 - 只有二进制文件(经过链接)才会这样做。

但是,如果您将自己构建为obj文件并将其与静态库一起重新打包,那么您可以大大减少使用自定义库回调的人的机会。 LIB can do that.没有其他人可以访问您的自定义回调的源 - 或标题 - 但是如果有人攻击它的确切符号名称(我认为你正在尝试的话),实现仍将从lib导出来自。)

答案 2 :(得分:0)

我无法找到任何关于不使用Windows链接器导出某些符号的文档,尽管我认为这个功能似乎存在于gnu链接器中。

你可以尝试的一件事是让你的新函数/操作符使用,因此依赖于另一个函数,比如MyFunction,在另一个.lib中。该.lib只包含MyFunction,它的唯一目的是提供这种依赖,这样你就可以成功链接你的二进制文件。如果没有这个新的.lib,使用新功能的任何人都无法成功链接。据推测,控制你的核心库的另一个.lib会更容易。

除了你不希望优化器消除对它的调用之外,你会希望MyFunction基本上是一个noop。此外,您可以让您的函数/运算符使用包含在另一个.lib中的数据项(而不是进行函数调用),再次使用相同的优化器警告。