我想创建一个抽象的链表实现(对 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环境中。
答案 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维护者将其包含在他们的存储库中。对于另一个链表库来说,这可能会很困难。