0

我想创建一个抽象的链表实现(对createListdestroyaddNodedeleteNode等进行一般操作)。如何使使用操作系统的任何人都可以使用这些功能?(我正在使用 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 环境中。

4

2 回答 2

2

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

您应该更喜欢公共头文件中的#include<>,因为首先在包含文件所在的同一目录中搜索#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
于 2012-11-20T19:17:35.617 回答
2

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

您将需要管理员权限(作为 root 或使用 sudo)。考虑使用“安装”命令。和“libtool”,如果你想构建你的库的共享对象。还有自动工具(autoconf 和 automake)。

如果你的意思是真的任何人,而不仅仅是你电脑上的任何人,用这个

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

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

于 2012-11-20T20:01:36.170 回答