我有源程序,
请问如何利用VC的命令行程序生成可被其它程序调用的lib文件?
在unix下直接用 ar 打成 .a 包就行了,
但是在windows下我直接用lib命令压成.lib包却不行。
我的步骤如下:c:\cl -c myprog.c
c:\lib /out:myprog.lib myprog.o请哪位明白人指点一下,谢谢!

解决方案 »

  1.   

    楼主应该用link.exe程序来生成.lib文件啊。具体参数可以参考MSDN和命令行帮助。
      

  2.   

    LINK.EXE 參數說明
      LINK [objs],[exefile],[mapfile],[libs],[deffile] /A:size 排列區段位址,不可用於DOS程式 
    /B 抑制.lib或.obj路徑錯誤提示 
    /CO 加入CodeView的符號及列號 
    /CP:number 設定程式最大空間(單位16B) 
    /DO 以預設值(DOSSEG)排列區段順序 
    /DS 載入資料至資料區段高位址 
    /E 壓縮執行檔,與/CO或/INC不容 
    /F 使遠程呼叫致能與/PAC並用 
    /HE 顯示link.exe選譯項 
    /HI 執行時載入高記憶位址 
    /INC 準備加入ILINK連結 
    /INF 顯示連結過程的訊息 
    /LI 加入列號與結合位址至MAP程式 
    /M 加入公用符號至MAP程式 
    /NOD[:library] 忽略指定程式庫 
    /NOE 阻止LINK從程式庫中搜尋擴充字 
    /NOF 遠程呼叫失效 
    /NOI 區別大小寫字母 
    /NOG 忽略群組的宣告,以便與古早版相容 
    /NOL 抑制LINK版權訊息 
    /NON 與/DO同,但不加程式起始位元組 
    /NOP 不壓縮鄰近程式區段 
    /OV 設定抑制插斷 
    /PACKC:number 壓縮鄰近程式區段 
    /PACKD:number 壓縮鄰近資料區段 
    /PAU 暫停以便更換磁片 
    /PM 指定Windows或OS/2程式型態 
    /Q 建立程式庫給Quick語言 
    /SE:number 設定連結時區段總數,預設為128 
    /ST:number 以此設定堆疊的大小(1~64KB) 
    /T 建立極小模式程式.COM(需設.model tiny) 
    /? 顯示簡單的LINK語法
      

  3.   

    到底应该怎么弄呀,我不是VC程序员,只是临时要用一个由c源码来的库文件。
    有没有人能说清怎样从 myprog.c 到 myprog.lib
    能回答这个问题即可获100分,怎么无人响应
    看来还是混饭吃的较多呀
      

  4.   

    csdn 上总是有些怪异的问题;
    首先,我问楼主,从命令行生成LIB,有什么必要?命令行是DOS年代的东西,倒现在为什么还要抓住不放?
      

  5.   

    这是因为我的程序是从UNIX上移植过来的,我有自己的makefile,不光有c,还有别的语言,是个混合的工程。C仅仅是提供一些基础库。我没有必要全部移植到到VC,VC也不可能解决我的问题。试想,我有上百个lib,我都得去界面一个个建工程吗?
      

  6.   

    非要用命令行也很简单:
    1.用VC下的cl.exe 先将mylib.c 生成mylib.obj 中间文件
       cl.exe /c /MLd mylib.c
    2.用lib.exe 生成mylib.lib文件就是你要的文件了.
       lib.exe /OUT:my.lib mylib.obj
    注:如果你要生成exe文件,才使用link.exe对obj文件进行编译链接,否则根本不用link.exe,不关他的事.呵呵,下面是个小例子,加深理解:建一个源文件,就叫mylib.c,我上面是这么叫的,内容如下:
    /* mylib.c */
    #include <stdio.h>
    void foo()
    {
       printf("%s","I am from mylib!\n");
    }用 cl /c /MLd mylib.c
    命令编译,注意/MLd选项是指定libcd.lib为默认标准库。lib.exe是VC自带的用于将目标文件打包成程序库的命令,所以我们可以用
    lib /OUT:my.lib mylib.obj将mylib.obj打包成库,输出的库文件名是my.lib。上例不能单独运行(不能用link链接成exe文件),如果要运行还要有个主函数.这里仅仅是为了举例子.就一切从略了.希望完全的解答了你的问题.
      

  7.   

    补充一点:   VC带的编译器名字叫cl.exe,它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib);/MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;/MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,因此/MLd对应调试版单线程静态标准库(libcd.lib),/MTd对应调试版多线程静态标准库(libcmtd.lib),/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,DLL是msvcrtd.dll)。/ML 是缺省选项,所以你也可以不加,上例中,如果:
    cl.exe /c /MLd mylib.c 不成功,你还可以试试 cl.exe /c mylib.c,多试一下吧,一定没有问题的.这类文件多的话建议写一个bat文件(加参数的)进行处理,如果有一二百个,就写个程序一次读入所有*.c文件,再自动一个一个的调用这个bat文件,也很快就处理完了. good luck...
      

  8.   

    看来还是有高手呀,非常感谢TianChong(VC.NET++),完全解决了我得问题。
    我开始之所以不成功是我的源程序的问题,里面的函数名是小写,但是调用程序里不管大写小写,都要找大写的函数名。我把C的源程序里的函数名改为大写,再打成lib包,调用程序就可以识别了。