免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11508 | 回复: 2
打印 上一主题 下一主题

makefile生成.so文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-25 10:27 |只看该作者 |倒序浏览
10可用积分
我的目录结构:
./src/funs.c,Makefile
./header/funs.h
./main/main.c
./Makefile

/*******************************************************************
*        ./src/funs.c
********************************************************************/
#include <stdio.h>
int my_add(int a,int b)
{
     return (a+b);
}

/*******************************************************************
*        ./src/Makefile
********************************************************************/
../libfuns.a:funs.o
     ar crv $@ $^
funs.o:funs.c
    gcc -c $^


/*******************************************************************
*        ./main/main.c
********************************************************************/
#include "funs.h"
void interface()
{
  int i=1,j=2;
  printf("The result of %d and %d is %d",i,j,my_add(i,j));
}


/*******************************************************************
*        ./Makefile
********************************************************************/
mylib:main.o
        gcc -nostdlib -W1,-soname,libmain.so -W1,-shared,-Bsymbolic
-L. -lfuns  -I./header  $^ -o libmain.so
main.o: ./main/main.c
            gcc -c  -fno-exceptions -fpic -Os -I./header  -o $@ $^
clean:
         rm *.o



我想把funs.c编译成一个libfuns.a,然后在把main.c和libfuns.a编成一个libmain.so,
先在./src目录执行make 生成libfuns.a,然后在./执行make生成libmain.so,
但是生成libmain.so,Link的时候,出现了链接不到my_add和printf的情况,请求大家的帮助。

[ 本帖最后由 gisspirit 于 2009-9-25 14:03 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-26 11:56 |只看该作者
我试了试改了下Makefile

链接不到printf应该是-nostdlib造成的,去掉即可

链接不到my_add我是这样解决的,不用 -L. -lfuns这样的形式,直接使用libfuns.a这个文件
也就是把第一条Makefile规则改成
gcc -W1,-soname,libmain.so -I./header  $^ libfuns.a  -shared -o libmain.so

另外原先那个-W1,-shared,-Bsymbolic似乎是不太常见的编译选项
也会导致问题,直接改成了-shared就好了

这样可以成功编译出so文件,而且我也试过是可以链接的

至于为什么不能用-L. -lfuns去编译生成.so,暂时还不太明白,是不是编译.so时有什么限制...

论坛徽章:
0
3 [报告]
发表于 2009-09-27 15:02 |只看该作者
原帖由 lemoncookie 于 2009-9-26 11:56 发表
我试了试改了下Makefile

链接不到printf应该是-nostdlib造成的,去掉即可

链接不到my_add我是这样解决的,不用 -L. -lfuns这样的形式,直接使用libfuns.a这个文件
也就是把第一条Makefile规则改成
gcc  ...


更改一下,我觉得这个不能用-L. -lfuns编译是个很奇怪的问题,所以今天又试了试
是可以的!昨天为什么有问题我也不知道...
也就是实际上Makefile可以这么写
mylib:main.o
        gcc -W1,-soname,libmain.so -I./header  $^ -L. -lfuns  -shared -o libmain.so
main.o: ./main/main.c
        gcc -c -fPIC -fno-exceptions -Os -I./header -o $@ $^
clean:
        rm -f *.o *.so

编译得到libmain.so没有错误
而且确认这个libmain.so是可以链接的

good luck
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP