我有一个关于用普通 c 编写库的概念问题。我有一些函数必须在同一文件夹中的不同程序中使用,所以我正在考虑编写一个库来托管这些功能。我必须将整个代码编写在一个文件夹中,该文件夹将被复制到另一台计算机(程序将在那里运行(。如果我在此文件夹中创建和编译库,用户是否能够在不从源代码重建库的情况下运行程序,或者他可能会有一些不可预测的错误?无论如何,用户将构建使用该库的程序,他不会构建库本身。
谢谢
洛伦佐
一般来说,不,它是不可移植的,因为编译的库可以在任意其他系统上链接。编译的库必须与目标架构、操作系统、编译器系统等兼容。
但是您还有另一种选择,从您的评论中得出结论:您似乎还提供了一些 shell 脚本或 makefile 来构建程序。
由于库"仅"由一组编译的翻译单元组成,然后其中一些翻译单元才能链接到程序中,因此您可以获取这些翻译单元的源集,并在适当的情况下使用每个程序的源编译它们。
例如,假设您有 2 个函数(每个函数在自己的源文件中(,您可以在 3 个程序中以不同的组合使用。"PRG1"使用func1()
,"PRG2"使用func2()
,"PRG3"同时使用两者。
这可以是使用(静态(库构建程序的命令:
gcc -c func1.c -o func1.o
gcc -c func2.c -o func2.o
ar -r lib.a func1.o func2.o
gcc prg1.c lib.a -o prg1
gcc prg2.c lib.a -o prg2
gcc prg3.c lib.a -o prg3
而不是库,你直接编译程序的源代码:
gcc prg1.c func1.c -o prg1
gcc prg2.c func2.c -o prg2
gcc prg3.c func1.c func2.c -o prg3
结果是相同的,至少只要您静态链接到库
。但即使使用共享(动态(库,方法也是相同的。共享库"仅"在同时运行多个使用共享库的程序时节省一些 RAM。如果一次只运行一个程序,则动态链接的程序可能需要更多 RAM 并且加载速度较慢。