linux 如何产生so文件,printf()函数 【转】Linux下gcc编译生成动态链接库*.so文件并调用它(2)...

本文仅限于介绍 linux 下的库。

1.2、 库的种类

linux 下的库有两种:静态库和共享库(动态库)。

二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

静态用.a为后缀, 例如: libhello.a

共享库(动态库)的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

动态通常用.so为后缀, 例如:libhello.so

共享库(动态库)的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如:libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。

libbrokenlocale.so.1 libgcc_s.so libnss_dns-2.5.so libnss_nis.so.2 libthread_db-1.0.so。

两者换算关系为:r=ln(1+r0)或r0=exp(r)-1例如r0=0.06,则r=ln(1+0.06)=0.0583,即100以583%的连续复利投资第二年将获106,该结果与直接用r0=0.06计算的答案一致。

例如r0=0.06,则r=ln(1+0.06)=0.0583,即100以583%的连续复利投资第二年将获106,该结果与直接用r0=0.06计算的答案一致。

a需=-103.6 ×ln(1-0.9975)÷0.08。

1.3、静态库,动态库文件在linux下是如何生成的:

以下面的代码为例,生成上面用到的hello库:

#include 'hello.h'

void sayhello()

{

printf('hello,world ');

}

首先用gcc编绎该文件,在编绎时可以使用任何合法的编绎参数,例如-g加入调试代码等:

$gcc -c hello.c -o hello.o

1、生成静态库 生成静态库使用ar工具,其实ar是archive的意思

$ar cqs libhello.a hello.o

2、生成动态库 用gcc来完成,由于可能存在多个版本,因此通常指定版本号:

$gcc -shared -o libhello.so.1.0 hello.o

1.4、库文件是如何命名的,有没有什么规范:

在 linux 下,库文件一般放在/usr/lib和/lib下,

静态库的名字一般为libxxxx.a,其中 xxxx 是该lib的名称;

动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号,minor是副版本号

1.5、可执行程序在执行的时候如何定位共享库(动态库)文件 :

而且,对于win8系统,它利用uefi安全启动以及固件中存储的证书与平台固件之间创建一个信任源,可以确保在加载操作系统之前,近能够执行已签名并获得认证的“已知安全”代码和启动加载程序,可以防止用户在根路径中执行恶意代码。

单击new,选择python解释器python.exe,打开后显示出一个包含很多复选框的窗口,选择需要加入系统pythonpath的路径,单击ok。

同理,单击new,选择d:\jython2.5.3目录下的jython.jar包,打开后显示出一个包含很多复选框的窗口,选择需要加入系统pythonpath的路径,单击ok。

#你需要知道解释器的完成路径名称。

对于 elf 格式的可执行程序,是由 ld-linux.so* 来完成的,它先后搜索 elf 文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache 文件列表— /lib/,/usr/lib目录找到库文件后将其载入内存

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/ruanjian/article-90979-2.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过Java Native Interface(JNI)调用C或C++编写的动态链接库(也就是Windows下的.dll文件Linux下的.so文件)。以下是一些简单的步骤: 1. 编写C或C++代码并将其编译动态链接库文件(.dll或.so文件)。 2. 在Java使用JNI接口声明与C或C++代码函数对应的Java本地方法,并将其实现为Java本地方法。 3. 编译Java代码并将其打包成jar文件。 4. 将生成动态链接库文件放到Java程序能够访问到的目录下。 5. 运行Java程序。 以下是一个简单的示例: 1. 编写C代码 ```c #include <stdio.h> #include "jni.h" JNIEXPORT void JNICALL Java_com_example_Test_print(JNIEnv *env, jobject obj, jstring str) { const char *c_str = (*env)->GetStringUTFChars(env, str, NULL); printf("%s\n", c_str); (*env)->ReleaseStringUTFChars(env, str, c_str); } ``` 函数名必须以Java_开头,并加上Java类的完整路径和方法名。 2. 编译动态链接库文件 假设我们已经将上述代码保存为test.c文件,可以使用以下命令将其编译动态链接库文件: - Windows:gcc -shared -o test.dll test.c -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" - Linuxgcc -shared -o libtest.so test.c -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" 注意:这里需要将JDK的include目录和平台相关的include目录添加到编译选项。 3. 在Java声明本地方法 ```java public class Test { static { System.loadLibrary("test"); // 加载动态链接库文件 } public static native void print(String str); } ``` 4. 实现Java本地方法 ```java Test.print("Hello, world!"); // 调用本地方法 ``` 这样就可以在Java调用C代码了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值