阻止Visual Studio导出静态库中的函数

时间:2011-10-31 17:07:10

标签: c visual-studio static-libraries

奇怪的问题:我正在使用Visual Studio构建一个静态库,我正在使用一个包含实用程序函数列表的源文件,我也在导入静态库的可执行项目中使用它。结果我得到这样的错误:

4>newfuncs.lib(util.obj) : error LNK2005: _shift_left already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _chop already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _crc_begin already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _crc_update already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _crc_result already defined in util.obj
4>newfuncs.lib(util.obj) : error LNK2005: _strtok_r already defined in util.obj

任何人都知道如何弄清楚如何让Visual Studio不导出util.obj中的函数,因为它们本身存在于实际的可执行项目中。

2 个答案:

答案 0 :(得分:1)

  • 简单的答案是将util.obj中的函数拉入自己的库中,并将您的库和可执行文件链接起来。
  • 如果您只需要在单个源文件中使用实用程序函数,则可以将它们移动到.c文件中并将它们声明为静态,然后它们将不会在它们所定义的文件之外具有任何链接。
  • 如果你真的想通过不导出符号来做到这一点,请用__declspec(selectany)标记该函数,这将告诉VS函数的多个定义是等价的,并且可以随意选择它们(确保它们'实际上是一样的!)。

答案 1 :(得分:1)

所以,想通了:如果使用pragma语句,它会将函数集成到静态库中。在我的情况下,我把:

#pragma comment(lib, "libev.lib")

在标题中,它将libev导入到我的库中。现在,当我实际编写可执行文件时,我只需要链接到我的库:没有额外的libev依赖项。