请问怎么用gcc生成.so文件,谢谢

xiciliu 2005-03-21 10:34:22
re
...全文
2694 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiciliu 2005-03-23
  • 打赏
  • 举报
回复

不结帖还给不了分
还不想结帖咯
以后再给
继续讨论
xiciliu 2005-03-23
  • 打赏
  • 举报
回复
:)
经过Ropyn(剑心)提示,问题终于得到解决了。mv Name.so libName.so就好了
看来后面生成.so时要用到 -o libName.so啦
就象在window Nt下面生成.dll时要写成 -o FeName.dll一样
谢谢Ropyn,谢谢所以上面回答该问题者
哈哈
派分了

对于 -fPIC -shared 为什么必须呢?
我好象没有做啊

我的步骤是:
1.写好test.java文件,并javac test.java编译好
2.使用javah -jni test生成test.h文件
3.写好test.c文件,gcc -c -I/usr/java/include -I/usr/java/include/saloris test.c -o test.so
4.运行java test 。

tengulre 2005-03-22
  • 打赏
  • 举报
回复
楼上的都答了.
sharkhuang 2005-03-22
  • 打赏
  • 举报
回复
-fPIC
-shared

必须
DanXer 2005-03-22
  • 打赏
  • 举报
回复
这个是jni的问题,
应该这样调用
System.loadLibrary("Name")
java会将库名进行映像,根据平台的不同,库名也不同,在linux上,上面的调用将库映射为libName.so (hehe,就是linux的ld -l标志的规则。),就是加了前缀lib和后缀.so。
所以,那个Name.so当然是找不到了。就抛出了UnsatisfiedLinkError异常。
java找这个库就是在LD_LIBRARY_PATH的路径中找的,你做的是正确的。

如果想要指定文件名调用,用Runtime.Load(文件名);

多说一句,在windows上则映射为Name.dll
xiciliu 2005-03-22
  • 打赏
  • 举报
回复
大家的我都看了
收益非浅

用大家办法尝试了
.so是生成了
但是在运行 java Name 时
问题又来
提示出错如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no MyNative in java.libra
ry.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at MyNative.<clinit>(MyNative.java:17)
我就setenv LD_LIBRARY_PATH {Name.so所在的文件夹}
但是问题同样存在

该怎么办呢?
spiderww 2005-03-22
  • 打赏
  • 举报
回复
为什么我用-share就报错,用-G就可以呢?我是在solaris下,用-G可以生成.so文件,-share和-G的区别在哪里?
DanXer 2005-03-21
  • 打赏
  • 举报
回复
最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件。
你也可以加上(一般这么做)
-fPIC (不是必需的,只是保证二进制在solaris上的可移植性,生成相对固定的符号指针)
你还可以加上
-soname <库内部名称>,该名称被动态连接器用来运行时查找这个库,而不是用编译时用-o指定的文件名来找这个库。
Wolf0403 2005-03-21
  • 打赏
  • 举报
回复
refer to: http://community.csdn.net/Expert/TopicView.asp?id=3410946
Wolf0403 2005-03-21
  • 打赏
  • 举报
回复
.a 是静态库,由 ar 打包 .o 对象文件得到;.so 是 shared object 也是动态库,由 gcc -shared 编译得到。
xfzhao_cn 2005-03-21
  • 打赏
  • 举报
回复
up, 是一个生成.so 文件的Makefile.
你看了,应该会明白的.
xfzhao_cn 2005-03-21
  • 打赏
  • 举报
回复
GCC=gcc
CFLAGS=-Wall -ggdb -fPIC
#CFLAGS=

all: libfunc

libfunc:func.o func1.o
$(GCC) -shared -Wl,-soname,libfunc.so.1 -o libfunc.so.1.1 $<
ln -sf libfunc.so.1.1 libfunc.so.1
ln -sf libfunc.so.1 libfunc.so

%.o:%.c
$(GCC) -c $(CFLAGS) -o $@ $<

clean:
rm -fr *.o
rm -fr *.so*
jellen 2005-03-21
  • 打赏
  • 举报
回复
你可以用gcc的-c选项生成.o文件,然后用ar命令生成.a文件(和.so一样也是库文件)。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧