如何让每个人都可以使用我的API?

时间:2012-11-20 19:07:22

标签: c linux api libraries abstraction

我想创建一个抽象的链表实现(对 createList destroy addNode deleteNode <进行一般操作) / em>等)。如何为使用操作系统的任何人提供这些功能? (我正在使用Ubuntu。)

我可以声明一个函数:

在add.h中:

int add(int a,int b);   /* add.h having the declaration */  

在add.c中:

#include "add.h"    
int add(int a,int b)    /* add.c having only definition */
{
    return (a+b);
}

在main.c中:

#include<stdio.h>
#include"add.h"
int main() 
{
 //use add() here
}

如何在Linux环境中设置API,使add.c中的实现对API的用户隐藏?我不想强迫API的用户将add.h文件复制到他们的工作目录中;我宁愿用某种方法将它安装到Linux环境中。

2 个答案:

答案 0 :(得分:2)

原生API分布在表头+库中。构建软件时的API用户在将源代码编译为目标文件时指定头搜索路径(-I / dir / with / headers),以及库搜索路径(-L / dir / with / libs)和库(-lmylibname)时将目标文件链接到库或二进制文件。有些人还喜欢将库搜索路径嵌入到正在构建的库和二进制文件中,这可以通过-Wl,-rpath = / dir / with / libs链接时间gcc标志来完成。

您应该更喜欢#include&lt;&gt;在公共标题中,#include“”首先在包含文件所在的同一目录中搜索,这可能会减慢编译速度。

以下大多数操作都可以使用标准开发Linux工具(automake等)实现自动化。

构建API的命令行:

gcc -c -o add.o -fPIC add.cc -I/dir/where/add_h

用于链接API的命令行:

gcc -shared -fPIC -Wl,-soname=add -olibadd.so

编译客户端代码(main.c)的命令行:

gcc [-I/dir/with/headers] -o main.exe [-L/dir/with/libs] -ladd [-Wl,-rpath=/dir/with/libs] main.c

答案 1 :(得分:2)

如果bobah的解决方案不够好,因为您不想指定源当前的路径,当您使用 API时,您可以将库安装到系统中目录(/ usr / local / lib,/ usr / local / include等)。然后,您将不需要-I-L。您仍然需要-l

您需要管理员权限(root,或使用sudo)。 考虑使用“install”命令。 和“libtool”,如果你想建立你的图书馆的共享对象。 和autotools(autoconf和automake)。

如果您的意思真的是任何人,而不仅仅是您计算机上的任何人,请使用此

  

任何使用操作系统的人? (我正在使用Ubuntu。)

然后你还需要构建一个源代码包或二进制包。并说服Ubuntu维护者将其包含在他们的存储库中。对于另一个链表库来说,这可能会很困难。