需要动态链接库的程序在LINUX下怎么运行它?

时间:2023-01-04 18:39:13
我有一程序simple,需要动态链接库simplib1.so和simplib2.so。我现在将这三个文件都放在了同一个目录下,但执行simple时仍提示不能载入simplib1.so和simplib2.so。我该怎么办?

3 个解决方案

#1


我做过UNIX下的动态连接,下面是样例:由于不能马上有台Linux的机器帮你试一下,所以希望你能从例中得到点启示。
-------  --------- 
操作系统:SCO OpenServer 5.0.5
1.C语言下的实现
创建程序共享库:
通过为cc加上-G选项,来生成共享库,例如:
cc -G -o libmyso.so -K PIC function1.c function2.c 
这个命令会建立名为libmyso.so的共享库.共享库中包函有function文件定义的对象或函数.

连接共享库:
使用下面的命令来编译连接使用动态连接库的应用程序
cc -L/usr/yourpath -o main main.c -lc -Bdynamic 
其中:-L/usr/yourpath 指出共享库的存放路径;
     -Bdynamic 通知编译器开启动态连接编译选项;

动态连接程序接口:
可以使用动态连接机制的程序接口,将共享库对象在程序执行期间连入进程执行,并在程序不再使用时卸载共享库.
dlopen() 打开一个共享库
dlclose()关闭共享库
dlsym()导出共享库有的对象
dlerror()获取共享库的出错信息.
下面给出一个例子说明动态库的使用:

例子:
// soexam.c
#include <stdio.h>
#include <string.h>
/* an share library example */
void ShowVersion()
{
printf("New Ver: 1.0.2\n");


/* main.c */
#include <string.h>
#include <dlfcn.h>
int main()
{
void *handle;
int i, *iptr;
void (*fptr)(void);
         handle = dlopen("/usr/sbz/libexm.so", RTLD_LAZY);
         fptr = (void (*)(void))dlsym(handle, "ShowVersion");
    fptr();
    return 0;
  }
你是不是注意一下编译连接的选项。还有打开动态库时的路径。

#2


你看看gcc的man 帮助。 下面是我在SCO UNIX下动态库的实现,希望对你有点帮助。因为我现在不能马上有台机器来为你试Linux下的实现。你就从中得到点启示吧。
---------------
UNIX下使用动态连接库  C语言下的实现
创建程序共享库:
通过为cc加上-G选项,来生成共享库,例如:
cc -G -o libfoo.so -K PIC function1.c function2.c function3.c
这个命令会建立名为libfoo.so的共享库.共享库中包函有function文件定义的对象或函数.
连接共享库:
使用下面的命令来编译连接使用动态连接库的应用程序
cc -L/usr/yourpath -o main main.c -lc -Bdynamic 
其中:-L/usr/yourpath指出共享库的存放路径; -Bdynamic通知编译器开启动态连接编译选项;
动态连接程序接口:
dlopen() 打开一个共享库
dlclose()关闭共享库
dlsym()导出共享库有的对象
例子:
// soexam.c
#include <stdio.h>
#include <string.h>
/* an share library example */
void ShowVersion() {  printf("New Ver: 1.0.2\n"); } 
/* main.c */
#include <string.h>
#include <dlfcn.h>
int main()
{ void *handle;
  int i, *iptr;
  void (*fptr)(void);
  handle = dlopen("/usr/sbz/libexm.so", RTLD_LAZY);
  fptr = (void (*)(void))dlsym(handle, "ShowVersion");
  fptr();
return 0;
}

#3


不好意思,发重了。 为什么我之前发的贴子,现在才看到?

#1


我做过UNIX下的动态连接,下面是样例:由于不能马上有台Linux的机器帮你试一下,所以希望你能从例中得到点启示。
-------  --------- 
操作系统:SCO OpenServer 5.0.5
1.C语言下的实现
创建程序共享库:
通过为cc加上-G选项,来生成共享库,例如:
cc -G -o libmyso.so -K PIC function1.c function2.c 
这个命令会建立名为libmyso.so的共享库.共享库中包函有function文件定义的对象或函数.

连接共享库:
使用下面的命令来编译连接使用动态连接库的应用程序
cc -L/usr/yourpath -o main main.c -lc -Bdynamic 
其中:-L/usr/yourpath 指出共享库的存放路径;
     -Bdynamic 通知编译器开启动态连接编译选项;

动态连接程序接口:
可以使用动态连接机制的程序接口,将共享库对象在程序执行期间连入进程执行,并在程序不再使用时卸载共享库.
dlopen() 打开一个共享库
dlclose()关闭共享库
dlsym()导出共享库有的对象
dlerror()获取共享库的出错信息.
下面给出一个例子说明动态库的使用:

例子:
// soexam.c
#include <stdio.h>
#include <string.h>
/* an share library example */
void ShowVersion()
{
printf("New Ver: 1.0.2\n");


/* main.c */
#include <string.h>
#include <dlfcn.h>
int main()
{
void *handle;
int i, *iptr;
void (*fptr)(void);
         handle = dlopen("/usr/sbz/libexm.so", RTLD_LAZY);
         fptr = (void (*)(void))dlsym(handle, "ShowVersion");
    fptr();
    return 0;
  }
你是不是注意一下编译连接的选项。还有打开动态库时的路径。

#2


你看看gcc的man 帮助。 下面是我在SCO UNIX下动态库的实现,希望对你有点帮助。因为我现在不能马上有台机器来为你试Linux下的实现。你就从中得到点启示吧。
---------------
UNIX下使用动态连接库  C语言下的实现
创建程序共享库:
通过为cc加上-G选项,来生成共享库,例如:
cc -G -o libfoo.so -K PIC function1.c function2.c function3.c
这个命令会建立名为libfoo.so的共享库.共享库中包函有function文件定义的对象或函数.
连接共享库:
使用下面的命令来编译连接使用动态连接库的应用程序
cc -L/usr/yourpath -o main main.c -lc -Bdynamic 
其中:-L/usr/yourpath指出共享库的存放路径; -Bdynamic通知编译器开启动态连接编译选项;
动态连接程序接口:
dlopen() 打开一个共享库
dlclose()关闭共享库
dlsym()导出共享库有的对象
例子:
// soexam.c
#include <stdio.h>
#include <string.h>
/* an share library example */
void ShowVersion() {  printf("New Ver: 1.0.2\n"); } 
/* main.c */
#include <string.h>
#include <dlfcn.h>
int main()
{ void *handle;
  int i, *iptr;
  void (*fptr)(void);
  handle = dlopen("/usr/sbz/libexm.so", RTLD_LAZY);
  fptr = (void (*)(void))dlsym(handle, "ShowVersion");
  fptr();
return 0;
}

#3


不好意思,发重了。 为什么我之前发的贴子,现在才看到?