Chinaunix

标题: makefile生成.so文件的问题 [打印本页]

作者: gisspirit    时间: 2009-09-25 10:27
标题: makefile生成.so文件的问题
我的目录结构:
./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 编辑 ]
作者: lemoncookie    时间: 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时有什么限制...
作者: lemoncookie    时间: 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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2