user-0 提问: 如何创建C语言（.a文件）接口

回复:
user: user-1
content: 请问楼主windows下如何将.c文件封装成.a的库文件。

user: user-1
content: 请问楼主windows下如何将.c文件封装成.a的库文件。

user: user-0
content: 引用 12 楼 cfjtaishan 的回复:[quote=引用 9 楼 sys0613 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] 需要提供给.h文件，就如同我们使用printf时，也要引入stdio.h文件。 另外，除了.a文件外（静态库），更好建议使用.so文件（动态库），优点时动态库是可以在使用时才加载，这样可以缩小可执行程序的大小。 是的，我没弄过c语言这个模块，您说的感觉就是我理解的。前几个人说的都不太直接。对对，我理解也是我应该把我自己的源代码封成1个so文件，或者一个.a文件，然后里面有某个函数作为接口，然后再给对方一个.h文件，对方就可以用我的接口（模块了），是这个意思么？？开发接口是都这么做么？还是说需要我把源代码也提供给对方？？ 担心对方机器装的.so库不全，所以想蔡永军静态库.a，这样可以保证在任何机器都能运行。谢谢了[/quote] 是这个意思；开发接口一般都是这样的，提供库（一般是动态库）和头文件（头文件会有一些数据结构定义和函数接口声明和简单的描述），另外如果让别人更好理解还可能提供说明文档，比如README; 目前有些公司专门做中间件，所以不可能把源代码给别人，因为涉及到专利，版权；给了别人的代码，自己公司还有啥存在的必要，指望源代码吃饭呢。 你说的在任何机器上都能运行，这个不可能。因为不同的机器的编码方式不同，可以理解为指令格式不同，在PC上运行的是不能在ARM板上运行的，若要能在ARM板上运行需要使用ARM板对应的编译器编译出来的库。 另外，除了需要不同的编译器，代码要想在不同的环境下运行还要求代码具有很好的可移植性。因此不同的平台要想很好的使用，除了使用对应平台的编译器编译之外，还要求代码写的更好，可移植性好。 [/quote] 您好，再麻烦您一下，我这个模块有点大，问题一、涉及好多头文件，是要把这些头文件全部提供给用户么？问题二：我给用户提供的API接口函数有入参，且入参是一个结构体，这个结构体我是定义到头文件中的，并且这个结构体有引用了别的头文件。我有点不知道怎么弄提供给用户的头文件了，能指点下不？多谢

user: user-2
content: 引用 5 楼 sys0613 的回复:[quote=引用 1 楼 xiaoyuanyuan2009 的回复:] 你说的是提供源文件的方法，可以用.H .CPP .RC 这些。还有一种方法是提供DLL文件给对方使用 还有，我是linux平台，应该是用.a文件吧，不是DLL文件吧？[/quote] 我不知道你是 Linux。  那个我就不懂了

user: user-3
content: 引用 9 楼 sys0613 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 需要提供给.h文件，就如同我们使用printf时，也要引入stdio.h文件。 另外，除了.a文件外（静态库），更好建议使用.so文件（动态库），优点时动态库是可以在使用时才加载，这样可以缩小可执行程序的大小。 是的，我没弄过c语言这个模块，您说的感觉就是我理解的。前几个人说的都不太直接。对对，我理解也是我应该把我自己的源代码封成1个so文件，或者一个.a文件，然后里面有某个函数作为接口，然后再给对方一个.h文件，对方就可以用我的接口（模块了），是这个意思么？？开发接口是都这么做么？还是说需要我把源代码也提供给对方？？ 担心对方机器装的.so库不全，所以想蔡永军静态库.a，这样可以保证在任何机器都能运行。谢谢了[/quote] 是这个意思；开发接口一般都是这样的，提供库（一般是动态库）和头文件（头文件会有一些数据结构定义和函数接口声明和简单的描述），另外如果让别人更好理解还可能提供说明文档，比如README; 目前有些公司专门做中间件，所以不可能把源代码给别人，因为涉及到专利，版权；给了别人的代码，自己公司还有啥存在的必要，指望源代码吃饭呢。 你说的在任何机器上都能运行，这个不可能。因为不同的机器的编码方式不同，可以理解为指令格式不同，在PC上运行的是不能在ARM板上运行的，若要能在ARM板上运行需要使用ARM板对应的编译器编译出来的库。 另外，除了需要不同的编译器，代码要想在不同的环境下运行还要求代码具有很好的可移植性。因此不同的平台要想很好的使用，除了使用对应平台的编译器编译之外，还要求代码写的更好，可移植性好。

user: user-4
content: 通常需要一个.h文件的，否则对方只能动态加载，而且需要知道函数名称及调用方法

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:需要提供.h文件的原因是，函数有一个要求，先声明后使用的原则。 好的，感谢，那标准流程就是我提供一个.a文件或者.so文件，然后再提供一个.h文件给使用者就可以了吧？？我想咨询下，一般这种模块开发，模式一是给对方源代码+.h文件，还是像我刚才问的模式二 .a文件+.h文件，一般都是按照哪种给对方啊？对方在使用的时候，只要把这两个文件放到他的代码同一个目录，然后#include一下这个.h文件，然后一链接，就能使用了吧？你们开发中一般是给.a文件，还是直接给源码.c文件啊？感谢

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:需要提供给.h文件，就如同我们使用printf时，也要引入stdio.h文件。 另外，除了.a文件外（静态库），更好建议使用.so文件（动态库），优点时动态库是可以在使用时才加载，这样可以缩小可执行程序的大小。 是的，我没弄过c语言这个模块，您说的感觉就是我理解的。前几个人说的都不太直接。对对，我理解也是我应该把我自己的源代码封成1个so文件，或者一个.a文件，然后里面有某个函数作为接口，然后再给对方一个.h文件，对方就可以用我的接口（模块了），是这个意思么？？开发接口是都这么做么？还是说需要我把源代码也提供给对方？？ 担心对方机器装的.so库不全，所以想蔡永军静态库.a，这样可以保证在任何机器都能运行。谢谢了

user: user-3
content: 引用 5 楼 sys0613 的回复:[quote=引用 1 楼 xiaoyuanyuan2009 的回复:] 你说的是提供源文件的方法，可以用.H .CPP .RC 这些。还有一种方法是提供DLL文件给对方使用 还有，我是linux平台，应该是用.a文件吧，不是DLL文件吧？[/quote] dll是动态库，在Linux下是.so文件。

user: user-0
content: 引用 2 楼 user-5 的回复:提供给别人的可以是dll也可以是lib .h少不了，调用者需要看到接口的相关定义 您好，我是linux系统应该就是您说的lib吧，您说的lib是不是就是我理解的.a文件呢？？

user: user-3
content: 需要提供.h文件的原因是，函数有一个要求，先声明后使用的原则。

user: user-0
content: 引用 1 楼 xiaoyuanyuan2009 的回复:你说的是提供源文件的方法，可以用.H .CPP .RC 这些。还有一种方法是提供DLL文件给对方使用 还有，我是linux平台，应该是用.a文件吧，不是DLL文件吧？

user: user-3
content: 需要提供给.h文件，就如同我们使用printf时，也要引入stdio.h文件。 另外，除了.a文件外（静态库），更好建议使用.so文件（动态库），优点时动态库是可以在使用时才加载，这样可以缩小可执行程序的大小。

user: user-0
content: 引用 1 楼 xiaoyuanyuan2009 的回复:你说的是提供源文件的方法，可以用.H .CPP .RC 这些。还有一种方法是提供DLL文件给对方使用 您好，我不太懂您说的提供原文件的方法，我都封成.a给对方用了，为啥海角叫提供源文件方法啊？我理解的提供源文件的方法应该是把所有.c文件给对方啊？ 我理解的像我这种是不是应该就给对方一个.a文件和一个.h头文件，一共就两个文件给对方就行了？还需要把别的文件也给对方么？

user: user-5
content: 提供给别人的可以是dll也可以是lib .h少不了，调用者需要看到接口的相关定义

user: user-2
content: 你说的是提供源文件的方法，可以用.H .CPP .RC 这些。还有一种方法是提供DLL文件给对方使用