它是可移植的编译库吗?
Is it a compiled library portable?
我有一个关于用普通 c 编写库的概念性问题。我有一些功能必须在同一个文件夹中的不同程序中使用,所以我正在考虑编写一个库来承载这些功能。我必须将整个代码写在一个文件夹中,该文件夹将被复制到另一台计算机(程序将在其中 运行)。如果我在此文件夹中创建和编译库,用户是否能够 运行 程序而无需从源代码重建库,或者他可能会遇到一些不可预测的错误?无论如何,用户将构建使用库的程序,他不会构建库本身。
谢谢
洛伦佐
一般来说,没有,从编译库可以链接到任意其他系统的意义上来说,它是不可移植的。编译后的库必须与目标体系结构兼容,OS,编译器系统等等。
但是您还有另一个选择,从您的评论得出结论:您似乎还提供了一些 shell 脚本或 makefile 来构建程序。
因为库由 "just" 一组已编译的翻译单元组成,在其中一些链接到程序之前,您可以获取这些翻译单元的源集并将它们与每个翻译单元的源一起编译适当的程序。
例如,假设您有 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
结果是一样的,至少只要静态链接到库。
但即使使用共享(动态)库,方法也是相同的。如果多个程序 运行 并发 ,共享库 "only" 可以节省一些 RAM。如果一次只有一个程序 运行s,动态链接程序可能需要更多 RAM 并且加载速度较慢。
我有一个关于用普通 c 编写库的概念性问题。我有一些功能必须在同一个文件夹中的不同程序中使用,所以我正在考虑编写一个库来承载这些功能。我必须将整个代码写在一个文件夹中,该文件夹将被复制到另一台计算机(程序将在其中 运行)。如果我在此文件夹中创建和编译库,用户是否能够 运行 程序而无需从源代码重建库,或者他可能会遇到一些不可预测的错误?无论如何,用户将构建使用库的程序,他不会构建库本身。
谢谢
洛伦佐
一般来说,没有,从编译库可以链接到任意其他系统的意义上来说,它是不可移植的。编译后的库必须与目标体系结构兼容,OS,编译器系统等等。
但是您还有另一个选择,从您的评论得出结论:您似乎还提供了一些 shell 脚本或 makefile 来构建程序。
因为库由 "just" 一组已编译的翻译单元组成,在其中一些链接到程序之前,您可以获取这些翻译单元的源集并将它们与每个翻译单元的源一起编译适当的程序。
例如,假设您有 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
结果是一样的,至少只要静态链接到库。
但即使使用共享(动态)库,方法也是相同的。如果多个程序 运行 并发 ,共享库 "only" 可以节省一些 RAM。如果一次只有一个程序 运行s,动态链接程序可能需要更多 RAM 并且加载速度较慢。