• Cygwin .a 转为 .lib .dll


    cygwin可以编译生成windows下供调用的dll,包括vc可识别的lib。

    Cygwin-GCC

    Cygwin自带了一个GCC, 用于把C/C++-Source编译成Cygwin平台下的EXE/DLL,
    使用Cygwin必须用其自带的GCC, 因为内部会生成一些针对于平台的特定的初始化代码,
    如果用其余版本的GCC则很有可能导致程序不能正常运行.

    Cygwin-Shell中可直接使用gcc, 如下 :

    • 编译成DLL 注意Cygwin-GCC 默认导出所有的Function.
    gcc -shared xxx.c -o xxx.dll 
    
    • 编译成OBJ
    gcc -c xxx.c -o xxx.o
    
    • 编译成EXE
    gcc xxx.c -o xxx.exe 
    
    • 打包多个obj成一个Lib(非链接)
    ar r xxx.lib xxx1.o xxx2.o 
    
    • 引用外部DLL生成EXE
    gcc xxx.c ./L aaa.dll -o xxx.exe
    
    • 链接多个C文件,生成EXE.
    gcc xxx.c yyy.c -o zzz.exe
    
    • 引用/bin/include目录下头文件,生成OBJ
    gcc -I"/bin/include" -c xxx.c -o xxx.o
    
    • 链接some.a,生成EXE
    gcc -L"some.a" xxx.c -o xxx.exe
    

    如果想知道编译时具体的信息, 可以使用--verbose这个编译选项, 对于了解GCC的工作是很有帮助的.

    额外的,也可以写自己的导出Lib文件, 以方便其余程序引用DLL (如Cobol2002编译器就不支持直接引用DLL, 这个时候可以写一个Def, 并导出Lib文件, 便于Cobol2002使用)

    具体方法如下:

    1. 编译生成DLL :
      生成MyTest.dll
    gcc -shared MyTest.c -o MyTest.dll
    
    1. 写一个DEF文件 (这里是MyTest.def), 简单的格式大致如下:
    LIBRARY MyTest   //这里的MyTest对应于MyTest.dll
    EXPORTS
    AllocMemory @1  //导出的第一个function : 对应于MyTest.dll里面的AllocMemory(...), 注意, 参数可不用写
    ReadMemory @2   //导出的第二个function : 对应于MyTest.dll里面的ReadMemory-Function.
                    //注意: function可以不用全部导出, 可以只选择你需要的Function.
    
    1. 用LIB工具(VC6有提供)生成LIB文件 (这里是MyTest.lib) :
      默认生成的名称为MyTest.lib.
    lib /def:MyTest.def 
    
    1. 到此生成完毕, 连接的时候只需要引用MyTest.lib即可, 但要注意XXX.exe 和MyTest.dll要放在同一目录下.

    可以用 gcc --help 查看具体的命令 etc...

    编辑整理原文: https://www.cnblogs.com/Searchor/p/14473791.html

    If your .lib file is a normal static or import library with C-callable entry points,
    you can list foo.lib as an object file for gcc/g++, just like any *.o file.
    Otherwise, here are some steps:

    Build a C file with a function table.
    Put all functions you intend to use in that table.
    This forces the linker to include all the object files from the .lib.
    Maybe there is an option to force LINK.EXE to include an object file.

    • Build a dummy 'LibMain'.
    • Build a .def with all the exports you need.
    • Link with your .lib using link.exe.

    or

    • Extract all the object files from the .lib using LIB.EXE.
    • Build a dummy C file referencing all the functions you need, either with a direct call or through an initialized function pointer.
    • Build a dummy LibMain.
    • Link all the objects with this file+LibMain.
    • Write a .def.
    • Link.

    You can use these methods to use MSVC (and many other runtime libs) with Cygwin development tools.

    Note that this is a lot of work (half a day or so),
    but much less than rewriting the runtime library in question from specs...

    Thanks to Jacob Navia (root at jacob dot remcomp dot fr) for this explanation.

    6.19. How do I use cygwin1.dll with Visual Studio or Mingw-w64?

    If you want to load the DLL dynamically, read winsup/cygwin/how-cygtls-works.txt
    and the sample code in winsup/testsuite/cygload to understand how this works. The short version is:

    1. Make sure you have 4K of scratch space at the bottom of your stack.

    2. Invoke cygwin_dll_init():

    HMODULE h = LoadLibrary("cygwin1.dll");
    void (*init)() = GetProcAddress(h, "cygwin_dll_init");
    init();
    

    If you want to link statically from Visual Studio,
    to my knowledge none of the Cygwin developers have done this,
    but we have this report from the mailing list that it can be done this way:

    1. Use the impdef program to generate a .def file for the cygwin1.dll (if you build the cygwin dll from source, you will already have a def file)
    impdef cygwin1.dll > cygwin1.def
    
    1. Use the MS VS linker lib to generate an import library
    lib /def=cygwin1.def /out=cygwin1.lib
    
    1. Create a file "my_crt0.c" with the following contents
    #include <sys/cygwin.h>
    #include <stdlib.h>
    
    typedef int (*MainFunc) (int argc, char *argv[], char **env);
    
    void
        my_crt0 (MainFunc f)
        {
        cygwin_crt0(f);
        }
    
    1. Use gcc in a Cygwin prompt to build my_crt0.c into a DLL (e.g. my_crt0.dll).
      Follow steps 1 and 2 to generate .def and .lib files for the DLL.

    2. Download crt0.c from the cygwin website and include it in your sources.
      Modify it to call my_crt0() instead of cygwin_crt0().

    3. Build your object files using the MS VC compiler cl.

    4. Link your object files, cygwin1.lib, and my_crt0.lib (or whatever you called it) into the executable.

    Note that if you are using any other Cygwin based libraries that you will probably
    need to build them as DLLs using gcc and then generate import libraries for the MS VC linker.

    Thanks to Alastair Growcott (alastair dot growcott at bakbone dot co dot uk) for this tip.

    编辑整理原文: https://www.cnblogs.com/Searchor/p/14473791.html

    Ref

    https://cygwin.com/faq.html
    http://www.cygwin.com/
    失效 http://luckythc.itpub.net/post/31721/458942

  • 相关阅读:
    Java垃圾收集器概述
    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    Serialize a Long as a String
    数据库遇到的问题
    解决Safari页面缓存的问题
    idea -> Error during artifact deployment. See server log for details.
    正则表达式
    commons-lang
    Template和Style
    WPF资源
  • 原文地址:https://www.cnblogs.com/Searchor/p/14473791.html
Copyright © 2020-2023  润新知