c/c++ 编译so与动态加载so

c文件filea.c:

#include <stdio.h>
void fun1()
{
	printf("i am from filea fun1 \n");
}

c文件fileb.c:

#include <stdio.h>
void fun2()
{
	printf("i am from fileb fun2 \n");
}

测试文件testso.c

void fun1();
void fun2();
int main(int argc,char *argv[])
{
	fun1();
	fun2();
	return 0;
}

1.将filea.c fileb.c编译成so库供testso.c调用,命令如下:

gcc -Wall -fpic -shared filea.c fileb.c -o first.so

2.编译testso.c并链接共享库first.so

gcc -Wall testso.c first.so -o testso

3.执行。

此时,执行./testso 将会抛出./testso: error while loading shared libraries: first.so.0:cannot open shared object file: No such file or directory

程序 testso已经完成,但要运行它必须让其能定位到共享库 first.so,因为库中的函数要在程序运行时被加载。 需要注意的是,当前工作目录可能不在共享库的查找路径中,因此需要使用如下的命令行设定环境变量LD_LIBRARY_PATH:

 $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

再次执行./testso,输出正确结果:

时间: 2024-08-28 23:48:04

c/c++ 编译so与动态加载so的相关文章

动态生成java、动态编译、动态加载

我曾经见过一个“规则引擎”,是在应用系统web界面直接编写java代码,然后保存后,规则即生效,我一直很是奇怪,这是如何实现的呢?实际这就好像jsp,被中间件动态的编译成java文件,有被动态的编译成class,同时又动态的加载到classloader中.所以,本质上,纯java得规则引擎,是100%可以实现的. 1.动态生成java源代码.这个过程太过简单,直接略过. 2.动态编译. 我看我们自己的规则引擎也有动态编译,就是在生成BOM模型的时候.但是是调用Process执行javac.但这种

java动态编译类文件并加载到内存中

如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考笔者的这篇博文-(该博文暂未发布) 所谓动态编译,就是在程序运行时产生java类,并编译成class文件. 一.这里介绍两种动态编译java文件的方式. 第一种:使用Runtime执行javac命令 /** * 编译java类 * 使用Runtime执行javac命令 * @param name 类的全限定包名 不带后缀 例如com.test.Notice 而不要写成com.

实现Android 动态加载APK(Fragment or Activity实现)

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 最近由于项目太大了,导致编译通不过(Android对一个应用中的方法个数貌似有限制),所以一直琢磨着能否将某些模块的APK不用安装,动态加载,通过在网上查找资料和网友的帮助,终于实现了APK的动态加载,网络上介绍APK动态加载的文章非常多,但是我觉得写得非常好的就是这位大牛的,我基本上就是使用他的这种方案,然后加入了自己的元素.这位大牛是通过Activity实现的,我稍作修改

Java中动态加载jar文件和class文件

概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 动态加载jar文件 // 系统类库路径 File libPath =

动态加载和动态注册类技术的深入探索

Delphi的包是Delphi IDE的核心技术,没有包也就没有了Delphi的可视化编程.包也可以用在我们开发的项目中,其好处是可以代码共享,减小工程尺寸,单纯通过替换包文件就能实现工程的升级和补丁.但是我们要加载包,就要知道包中已经存在的类.关于如何动态加载包的资料比比皆是我就不想就此问题讨论了.但是Delphi的IDE很是特殊,它无需事先知道你的包有哪些类就能注册组建,创建组建.但是Borland没有公开BPL文件的格式.我们自己是否可以实现IDE的功能呢?首先我们知道.一个组件包想要能在

[javaSE] 反射-动态加载类

Class.forName(“类的全称”) ①不仅表示了类的类类型,还代表了动态加载类 ②请大家区分编译,运行 ③编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 Ⅰ所有的new对象都是静态加载类 在编译的时刻就要去检测该类是否存在,如果不存在,编译失败. //对于这种情况,静态加载不适用,因为我们需要根据输入来确定加载哪个类 package com.tsh.reflect; class ReflectLoadDemo { public static void main(String[]

动态类型 动态绑定 动态加载

1.动态类型运行时才知道,对象的类型,动态类型在编程中非常常见,简单的说就是id类型 比如代理在自定的时候就是,id类型.当前我们有时候自己定的方法,不确定,传进来的是什么类型的对象,我们也id类型,然后在方法内部去确定类型 2.动态绑定 对象被实例化后,就确定的对象类型,也确定了对象的属性和响应方法.这就是动态绑定. 说白也就是对象的确定了后,会绑定对应的属性和方法.那么我们也就可以动态的去给对象添加和实现方法.Class_addMethod 和 Method_setImplementatio

程序的执行——编译、连接与加载(上)

在掌握了一门编程语言并学习了操作系统和机组后,我脑袋里形成了两条并行的知识线,搞不清我的代码到底是如何与进程.内存管理这些知识结合起来的.虽然很多书都有涉及编译.连接与加载的知识,但是讲的都不够全面,系统性也不强.直到看了<深入理解计算机系统>,之前整理的小知识点终于联系起来.以下内容只是本人的简单整理,更多内容请看原书. 一.编译 @过程 编译是由代码文件(.c)生成可重定位目标文件(.o)的过程,如下: fredzzt.c/.h——Prepressing——>fredzzt.i  —

动态加载vs静态加载

动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载程序中有条件才运行的库. 4:热更新,在不停止程序的前提下进行更新. 5:复杂一些,需要显示获得函数地址. 6:dll没有对应的lib文件,此时只能进行动态加载. 静态加载: 1:简单方便 2:没有dll时,系统报错 3:加载运行很久的库 4:dll必需有相应的lib文件 加载方法: 1.确保有a.