c编译成so文件
在C语言中,.so文件是共享库(Shared Object)的扩展名,它是一种二进制文件,包含了一些可以被其他程序调用的函数和变量,要运行一个.so文件,你需要遵循以下步骤:,1、编写一个包含main函数的程序,,2、将上述程序编译为一个可执行文件, gcc shared o libhello.so print_hello.c,这将生成一个名为 libhello.so的共享库文件。,3、编写一个主程序,用于加载并运行共享库中的函数。,4、将上述主程序编译为一个可执行文件, gcc o main main.c ldl,这将生成一个名为 main的可执行文件。,5、运行可执行文件, ./main,你应该会看到输出 Hello, World!。,下面是整个过程的详细解释:,1、我们编写了一个包含main函数的程序,该程序调用了共享库中的一个函数 print_hello,这个函数被定义为无参数和无返回值,因此我们可以使用 void类型来声明它,注意,我们需要在程序中使用 extern "C"来告诉编译器按照C语言的规则进行链接,而不是按照C++的规则进行链接,这是因为共享库可能是用C++编写的,而我们的程序是用C语言编写的,如果不使用 extern "C",编译器可能会在链接时遇到问题。,2、我们使用 gcc编译器将上述程序编译为一个共享库文件。 shared选项表示我们要创建一个共享库,而不是一个可执行文件或静态库。 o libhello.so选项表示我们要将生成的共享库命名为 libhello.so,我们将源文件名传递给编译器,以便它可以正确地找到我们要编译的文件。,3、接下来,我们编写了一个主程序,用于加载并运行共享库中的函数,我们使用了 dlfcn.h头文件中的函数来实现这一目标,我们使用 dlopen函数打开共享库文件,这个函数需要一个字符串参数,表示要打开的文件名,我们还传递了 RTLD_LAZY标志给这个函数,表示我们希望在第一次调用共享库中的函数时才加载它们,这样可以减少程序启动时的内存占用,如果打开共享库失败, dlopen函数将返回一个空指针,我们可以检查这个指针是否为空来判断是否发生了错误,如果发生错误,我们可以使用 dlerror函数来获取错误信息,并将其打印到标准错误输出,我们使用 dlsym函数查找共享库中的函数,这个函数需要一个指向已打开的共享库的指针和一个字符串参数,表示要查找的函数名,我们将这两个参数传递给 dlsym函数,它将返回一个指向找到的函数的指针,如果找不到函数或者发生其他错误, dlsym函数将返回一个空指针,我们可以检查这个指针是否为空来判断是否发生了错误,如果发生错误,我们可以使用 dlerror函数来获取错误信息,并将其打印到标准错误输出,我们使用返回的函数指针来调用共享库中的函数,并关闭共享库句柄,注意,我们在调用共享库中的函数之前和之后都需要检查并处理错误,这是因为如果在调用过程中发生错误,程序可能会崩溃或者产生未定义的行为。,