编译使用库的 C 程序

标签 c linker autotools

我制作了一个使用 libsndfile 的 C 程序从音频文件中提取一些数据。

有什么可能使程序尽可能可移植,最好在安装时不需要 root 访问权限?

Libsndfile 在目标机器上不可用,所以我需要以某种方式将它与我的程序打包在一起。有没有办法静态链接库?我也看过一些 Autotools 教程,但我不确定如何继续。

我可以在我的开发机器上顺利编译,我使用包管理器安装了库:apt-get install libsnfile1-dev

makefile 非常简单:

CFLAGS=-std=c99 -Wall -pedantic -g
CLIBS= -lsndfile -lm
BIN=audiodecode
CC=gcc

MAIN=main.o

FILES=

OBJS=$(FILES) $(MAIN)

.PHONY: all
all: clean $(OBJS)
    $(CC) $(CFLAGS) -o $(BIN) $(OBJS) $(CLIBS)

.PHONY: clean
clean:
    rm -f *.o $(BIN)

最佳答案

很多包都捆绑了它们的依赖项。示例:rsync(包含捆绑的 libpopt)、gnupg(包含捆绑的 libz)。通常捆绑的其他依赖项是 gettext 或 glib。 要获得灵感,请查看这些流行的开源项目是如何做到的。

放入http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.25.tar.gz的内容进入子目录并添加适当的规则以首先构建子目录。

未经测试的示例代码: OBJS += libsndfile/libsndfile.a

libsndfile/libsndfile.a:
       cd libsdndfile && ./configure --enable-static && $(MAKE)

对于 Bonus points 添加配置脚本,检查系统是否已经安装了 libsndfile 并动态链接到它。

关于编译使用库的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689236/

相关文章:

c - memcpy() 无法正常工作

捕获通过 netcat 发送的 tun 接口(interface)上的数据包

ios - LinkedIn SDK 的位码错误

c - C中的共享全局变量

ubuntu - 如何解决 Ubuntu 中的链接错误?

autotools - 当我的包仅用 C 构建时,如何告诉 autoconf 不要探测 fortran、C++ 等?

c - 在编译时从符号表中获取一个函数名

c - 两种分配方式有什么区别?

autotools - OpenWRT 在编译时在 staging_dir 中寻找文件

linux - 包含 linux 内核配置的正确方法是什么?