我有一个工程 A ,但是想把其中的一些函数弄成一个静态链接库B,这样,其他程序也可能使用(只静态使用,就是链接时候,不是运行时候), 但是 静态链接库B 链接到 工程A中的时候要用到 很多其他环境库C。 而这些环境库C 是我在做工程A 时候可能没有的。那么怎么建立这样一个静态链接库B呢?我用VC里的静态库生成方法是很容易的可以生成B.LIB,但是将B.lib 链接到工程A 中的 时候它却要求我提供 环境库c ,而环境库c 我是希望链接到B.lib 中的。因为只有B.lib 中用到了他们,说明我的B.lib 没做对。请问如何做?

解决方案 »

  1.   

    回楼上。环境库C 是 B.LIB 里面的函数要用到的第三方库,也是我想隐藏的。他们是通过 输入库 那里填写后链接上的(如果B.LIB是个EXE的话)而我把B.exe做成 B.LIB 想要提供给 A.EXE 用,却是在 链接A.EXE 时候提示我 那个 环境库C。 因为 工程A.EXE 最后可能提供给用户,我不想将环境库C暴露。所以想隐藏在B.LIB。里。现在没做到。
      

  2.   

    如果环境库C是DLL形式的话,很难隐藏的
    可以做成资源放到B里,动态调用他们是通过 输入库 那里填写后链接上的(如果B.LIB是个EXE的话)
    是不是工程A也这样设置了?
      

  3.   

    回楼上,环境库C 都是 LIB 形式的,不是DLL 形式的。如果工程A 中像B.EXE那样设置那是可以编辑链接成功啊。可是那样就没隐藏了。实际上我不能让编译链接A的时候有环境库C 的,因为那是提供给用户的。 所以我想要得到一个 B.LIB。而且B.LIB 链接到 A.EXE 的时候不需要环境库C,就是环境库C 是包含在B.LIB中。可以做到吗?如何做?
      

  4.   


    可以用lib.exe合并两个lib文件,VS2003以上应该都有。到开始菜单里面运行"Visual Studio .NET 200X 命令提示",然后lib.exe a.lib b.lib,这样b就合并到a里面了。
      

  5.   

    谢谢楼上的。这样就可以 用了。就是 可以把 c.lib 合并到 b.lib中给 a.exe 用了。但是在链接 a.exe 的过程中出现了如下警告:1>Blib.lib(Blib.obj) : warning LNK4049: 已导入本地定义的符号 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z (public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > & (__cdecl*)(class std::basic_ostream<char,struct std::char_traits<char> > &)))很多过这样的 LNK4049 警告。这样的警告还是无意中暴露了 c或 b.lib 中的东西。(我希望用户在链接a.exe 的时候不发现的)如何消除这些链接警告呢?非常感谢。
      

  6.   

    顶一下,懂的帮忙。这个 4049 警告怎么消除呢? 不管在 b.lib 还是在 a.exe 的原代码中写 #pragma warning(disable:4049)都无法消除。
      

  7.   


    这个是a.lib、b.lib以及exe的默认导入库方式不同导致的,其中至少有一个链接了LIBC或者LIBCMT(也就是“C/C++->代码生成->运行时库”选项里面选的不是带DLL的方式),并也至少有一个链接了MSVCRT(也就是同样的地方选择了带DLL的方式)。这个warning是链接器的warning不是编译器的,需要在项目配置的(链接器->命令行->附加选项)里面加上“/ignore:4049”,我找不到对应的代码写法。不过或许可以通过消除lib自带的默认库的方式,来解决这个warning,这里给你一个clrdlib.exe试一下是否可行。用法是命令行下“clrdlib.exe a.lib”,这样就消除了a.lib的默认导入库。exe链接的时候选择链接MSVCRT.LIB应该就不会有warning,不过如果三者都不是MFC程序还是建议选择链接LIBCMT,虽然链接器会报4217警告,但不是不需要依赖DLL。clrdlib下载地址:http://d.namipan.com/d/0f28a6dbcd92e4a45d91b9085895ce36f69dab9e92400000
      

  8.   

    w_anthony 高手啊。 在链接 A.EXE 的时候用 /ignore 4049 就可以了。但是,因为我的 b.lib 库是给别人用的,就是说 假定 a.exe 的原文件是别人的。那我要告诉别人,在链接 b.lib 到 a.exe 的过程中。你必须设置这个。这样别人不设置,也就看到链接中的问题了。
    我想做干净点。自己在b.lib 中设置好。清除这个警告。怎么做呢? 就是如何在 B.LIB 的原文件中设置消除链接警告呢(等完了一起给分,还另加分给你)
      

  9.   


    这个我曾经也翻了不少资料,一直找不到对应的代码写法来屏蔽这类链接器warning,如果LZ可以找到,那也请分享一下。
    话说回来,LZ试过用clrdlib.exe来消除lib自带的默认C/C++运行库么?我对实验结果也感兴趣……
      

  10.   


    这个 clrdlib.exe 是谁编写的?怎么都查不到任何信息? 
      

  11.   

    不放心就找台虚拟机运行,再把lib拷回来,用UE二进制比较。它的作用就是把几处导入默认库的地方换成空格。