开发者

Difference between *.a and *.dll on Windows

开发者 https://www.devze.com 2022-12-17 22:45 出处:网络
What is the difference between *.a and *.dll on Windows? From what I understand one can package all the *.o files开发者_运维知识库 into a *.a, which is a distributable that other application can use,

What is the difference between *.a and *.dll on Windows? From what I understand one can package all the *.o files开发者_运维知识库 into a *.a, which is a distributable that other application can use, on Linux.

But what are the difference between *.a and *.dll? Are they interchangeable? If my application needs to link to *.a, can I link it to *.dll as a substitute?


Aside: There is no defined *.a format with plain Windows development tools, unless you use a Linux-based tool chain. You're presumably referring to a static library, aka .lib in Windows.

A DLL is the equivalent of a shared library (*.so) on Unix and no, you normally can't link to a shared library/dll if the linker expects you to link against a static library.


Seeing that *.a are Linux static libraries, they are not at all interchangeable with windows .dll (dynamic linking libraries),as they have entirely different formats. If your application needs to link to an .a that you created, you will need to recompile the source code that generated your linux static library (if possible) into a windows static library (.lib), and compile your code against that.


Under Linux with gcc you will see two kind of files the archives *.a (used to provide a set of functions to link in statically) and *.so, so called shared object library (to link dynamically). Their equivalent under windows for most compilers are *.lib and *.dll.

So *.a and *.dll are not interchangeable at all. Moreover you have under windows the dilemma that a *.lib can be used for both linking statically and dynamically (with fixed addresses). Another way is to bind fully dynamically with GetProcAddress but that has to overhead of creating a wrapper, might be what you need if you want to make the dlls work for different versions.

You may recognize the static libs at their size, they are huge in comparison to the libs used to link dynamically. In my projects I really often go the way with GetProcAddress as I like the ability to just drop in the fresh new DLLs for older applications without linking everything again.

0

精彩评论

暂无评论...
验证码 换一张
取 消