自定义C库:同一库中的函数是否可以相互引用?

自定义C库:同一库中的函数是否可以相互引用?,c,shared-libraries,C,Shared Libraries,我刚刚开始创建自己的C库,以保持常用函数的整洁。然而,我遇到了一个新问题,我很难找到关于最佳路线的信息 我使用以下方法生成包含两个函数的库: gcc -I. -c -fpic rand_site.c gcc -I. -c -fpic rand_spin.c gcc -shared -o libstatphys.so rand_site.o rand_spin.o 每个源文件都包含一个函数。我希望为我的库创建第三个函数,它使用上述两个函数,但我不确定如何使用同一个库中的函数 我这样做对吗?这样做

我刚刚开始创建自己的C库,以保持常用函数的整洁。然而,我遇到了一个新问题,我很难找到关于最佳路线的信息

我使用以下方法生成包含两个函数的库:

gcc -I. -c -fpic rand_site.c
gcc -I. -c -fpic rand_spin.c
gcc -shared -o libstatphys.so rand_site.o rand_spin.o
每个源文件都包含一个函数。我希望为我的库创建第三个函数,它使用上述两个函数,但我不确定如何使用同一个库中的函数

我这样做对吗?这样做的最佳做法是什么?

是的,你可以

创建一个头文件
rand_site.h
,并将
rand_site.c
中定义的函数声明放入其中

创建一个头文件
rand_spin.h
,并将
rand_spin.c
中定义的函数声明放入其中

使用
#include
将两个
.h
文件包含在第三个文件中,例如
foo.c

然后编译
foo.c
,并使用以下命令将其添加到库中:

gcc -I. -c -fpic foo.c gcc -shared -o libstatphys.so rand_site.o rand_spin.o foo.o 如果要使用
foo.o
创建可执行文件,可以使用:

gcc -I. -c -fpic foo.c gcc -shared -o libfoo.so foo.o -lstatphys gcc -I. -c foo.c gcc foo.o -lstatphys gcc-I-c foo.c gcc foo.o-lstatphys 是的,你可以

创建一个头文件
rand_site.h
,并将
rand_site.c
中定义的函数声明放入其中

创建一个头文件
rand_spin.h
,并将
rand_spin.c
中定义的函数声明放入其中

使用
#include
将两个
.h
文件包含在第三个文件中,例如
foo.c

然后编译
foo.c
,并使用以下命令将其添加到库中:

gcc -I. -c -fpic foo.c gcc -shared -o libstatphys.so rand_site.o rand_spin.o foo.o 如果要使用
foo.o
创建可执行文件,可以使用:

gcc -I. -c -fpic foo.c gcc -shared -o libfoo.so foo.o -lstatphys gcc -I. -c foo.c gcc foo.o -lstatphys gcc-I-c foo.c gcc foo.o-lstatphys 是的,你可以

创建一个头文件
rand_site.h
,并将
rand_site.c
中定义的函数声明放入其中

创建一个头文件
rand_spin.h
,并将
rand_spin.c
中定义的函数声明放入其中

使用
#include
将两个
.h
文件包含在第三个文件中,例如
foo.c

然后编译
foo.c
,并使用以下命令将其添加到库中:

gcc -I. -c -fpic foo.c gcc -shared -o libstatphys.so rand_site.o rand_spin.o foo.o 如果要使用
foo.o
创建可执行文件,可以使用:

gcc -I. -c -fpic foo.c gcc -shared -o libfoo.so foo.o -lstatphys gcc -I. -c foo.c gcc foo.o -lstatphys gcc-I-c foo.c gcc foo.o-lstatphys 是的,你可以

创建一个头文件
rand_site.h
,并将
rand_site.c
中定义的函数声明放入其中

创建一个头文件
rand_spin.h
,并将
rand_spin.c
中定义的函数声明放入其中

使用
#include
将两个
.h
文件包含在第三个文件中,例如
foo.c

然后编译
foo.c
,并使用以下命令将其添加到库中:

gcc -I. -c -fpic foo.c gcc -shared -o libstatphys.so rand_site.o rand_spin.o foo.o 如果要使用
foo.o
创建可执行文件,可以使用:

gcc -I. -c -fpic foo.c gcc -shared -o libfoo.so foo.o -lstatphys gcc -I. -c foo.c gcc foo.o -lstatphys gcc-I-c foo.c gcc foo.o-lstatphys

就像平常一样使用它们。函数调用同一个库中的其他函数没有什么特别之处,在同一个库中,就像@FilipeGonçalves所说的,根本没有问题。相反,如果有两个库,并且每个库都引用了另一个库,那么您可能需要在链接器命令行上进行特殊考虑,只需像平常一样使用它们。函数调用同一个库中的其他函数没有什么特别之处,在同一个库中,就像@FilipeGonçalves所说的,根本没有问题。相反,如果有两个库,并且每个库都引用了另一个库,那么您可能需要在链接器命令行上进行特殊考虑,只需像平常一样使用它们。函数调用同一个库中的其他函数没有什么特别之处,在同一个库中,就像@FilipeGonçalves所说的,根本没有问题。相反,如果有两个库,并且每个库都引用了另一个库,那么您可能需要在链接器命令行上进行特殊考虑,只需像平常一样使用它们。函数调用同一个库中的其他函数没有什么特别之处,在同一个库中,就像@FilipeGonçalves所说的,根本没有问题。相反,如果有两个库,并且每个库都引用了另一个库,那么您可能需要在链接器命令行上进行特殊考虑。因此,当对象文件被链接时,它们会相互了解吗?我想象如果没有库的一部分,
foo.c
将无法从单独的源文件调用这些函数。此外,我正在为所有源文件都包含的库
statphys.h
使用单个头文件。因此,我可以将其用于函数声明。@oLas foo.c可以调用库中的函数,而不必成为库的一部分。这就是我们能够使用标准库和第三方库的方式。对不起,我的意思是,如果我使用上面不使用库的行编译
foo.c
。这就是我最初困惑的地方,因为编译
foo.c
时不知道其他函数在哪里(即no-lstatphys标志),我知道它会编译,因为它有声明,但如果我尝试在库之外使用
foo.c
,它不会找到那些源文件?那么链接也会在目标文件之间共享信息?@oLas我扩展了我的答案,希望能回答您的问题。那么当目标文件链接时,它们会相互了解吗?我想象如果没有库的一部分,
foo.c
将无法从单独的源文件调用这些函数。此外,我正在为所有源文件都包含的库
statphys.h
使用单个头文件。所以我可以用它来声明函数。@oLas foo.c可以调用库中的函数,而不必成为