2010-03-22 66 views
1

我正在制作自己的静态库。我已经把我的代码工作了,现在把它放到一个静态库中供其他程序使用。在我的库中,我正在使用另一个静态库,我不希望那些将使用我的API的人知道。因为,我想隐藏他们的信息,我不能告诉他们安装其他静态库。 无论如何,我使用命令行Lib.exe来提取并创建一个只有我使用的obj的较小的lib文件。但是,我收到一串LNK4006 :second definition ignored链接器警告,对于我使用的每个obj,然后是LNK4221 no public symbols found;archive member will be inaccessibleLNK4221和LNK4006警告

我在vs2008中做了这项工作,我不知道我在做什么错。 我在我的.cpp文件中使用#pragma comment行 我还修改了库管理程序以将我的较小的.lib与其位置一起添加。 我的代码只是调用一些函数,它应该能够从较小的lib中的Obj文件中获得。 我的所有功能都在.cpp文件中实现,我的头文件只包含第三方头文件,并且包含标准的C++头文件。没有什么花哨。在那里我实际上没有函数定义。我打算把API定义放在那里,并在.cpp中实现我将要制作的这个静态库。但是,我只是想在添加更多内容之前构建我的代码。

我的确读过http://support.microsoft.com/default.aspx?scid=kb;EN-US;815773但它没有提供解决方案。

回答

3

即使从其他库中提取所有对象并将其放入自己的库中,用户仍然能够看到库中的内容,从而查看所有对象名称。在许多情况下,对象的名称将显示您正在使用的其他库的实际内容。

不要将库作为静态库来分发,而应考虑将其作为DLL进行分发。在DLL中,你可以很容易地隐藏所有底层的东西,只公开你想公开的内容。

+0

不幸的是没有。这是我必须遵循的要求。我收到了很多这些警告。所以,我试图通过不包括我根本没有使用的obj文件来减少数量。不过,问题依然存在,我需要将它作为静态库分发。 – user295030 2010-03-22 23:04:28

+0

@ user295030:你不能同时拥有两个。你可以“隐藏”实现细节,或者你可以有一个静态库。如果你尝试,你会得到这些链接器错误。您不能在另一个静态库中包含静态库。 @Patrick:+1 – 2010-03-23 14:44:58

+0

感谢您的回复。所以如果我去静态lib路由我怎么能使用这些第三方obj文件作为“一个”静态lib的一部分?我很欣赏关于需求问题的答案。但关于如何解决这些lnk4221/lnk4006的问题是什么在杀死我。我似乎无法解决这个问题?我的意思是,在vs2008中,它允许你在图书管理员选项卡下添加“依赖关系”,以及其他“库”。我不打算提供一个DLL肯定。他们确实回来并确认了一个静态库。所以这是我必须与之合作的。这是否清楚了一些事情? – user295030 2010-03-23 15:05:28