当前位置: 技术问答>linux和unix
不生成so的问题
来源: 互联网 发布时间:2017-02-10
本文导语: 小弟linux新手,目前遇到一个问题 在网上找到一个linux程序的源码,执行.configure后生成makefile,makeinstall后能生成对应的so和.a。 然后运行源码里的示例程序(程序会调用这生成的so里的方法)。 现在我自己写了几个...
小弟linux新手,目前遇到一个问题
在网上找到一个linux程序的源码,执行.configure后生成makefile,makeinstall后能生成对应的so和.a。
然后运行源码里的示例程序(程序会调用这生成的so里的方法)。
现在我自己写了几个功能函数,编译成一个静态库libfunc.a,然后想加入到这个程序里,在程序代码里调用我自定义的方法;
添加完我自己的静态库路径后,重新执行./configure --host=arm-linux,生成的makefile也都没有问题,会去链接我的库,(生成的makefile中CFLAGS里有-lfunc),make通过,我也确认程序里已经调用了libfunc.a里的函数(改下函数名报错,改为正确的ok)。
问题来了,so是生成了,但是运行示例程序时会报 undefined symbol:mytest,这个mytest就是我.a里定义的函数。
为什么我make都通过了,在运行程序的时候反而报了个没定义的符号?这个一般不都是在link的时候才会报么?
不解的是,既然make是没问题的,那怎么运行时会报这个错误呢?(找不到这个函数的话,编译时就应该报错了才对)
linux菜鸟,请大家帮助解决一下,谢谢了~~~~
在网上找到一个linux程序的源码,执行.configure后生成makefile,makeinstall后能生成对应的so和.a。
然后运行源码里的示例程序(程序会调用这生成的so里的方法)。
现在我自己写了几个功能函数,编译成一个静态库libfunc.a,然后想加入到这个程序里,在程序代码里调用我自定义的方法;
添加完我自己的静态库路径后,重新执行./configure --host=arm-linux,生成的makefile也都没有问题,会去链接我的库,(生成的makefile中CFLAGS里有-lfunc),make通过,我也确认程序里已经调用了libfunc.a里的函数(改下函数名报错,改为正确的ok)。
问题来了,so是生成了,但是运行示例程序时会报 undefined symbol:mytest,这个mytest就是我.a里定义的函数。
为什么我make都通过了,在运行程序的时候反而报了个没定义的符号?这个一般不都是在link的时候才会报么?
不解的是,既然make是没问题的,那怎么运行时会报这个错误呢?(找不到这个函数的话,编译时就应该报错了才对)
linux菜鸟,请大家帮助解决一下,谢谢了~~~~
|
你这里说的好像有些问题。
现在我自己写了几个功能函数,编译成一个静态库libfunc.a,然后想加入到这个程序里,在程序代码里调用我自定义的方法;
添加完我自己的静态库路径后,重新执行./configure --host=arm-linux,生成的makefile也都没有问题,会去链接我的库,(生成的makefile中CFLAGS里有-lfunc),make通过,我也确认程序里已经调用了libfunc.a里的函数(改下函数名报错,改为正确的ok)。
问题来了,so是生成了,但是运行示例程序时会报 undefined symbol:mytest,这个mytest就是我.a里定义的函数。
静态库使用时不是用-l的,你的makefile里面有-lfunc说明使用的不是你的静态库而是要使用libfunc.so动态库。
gcc *** -L** libfunc.a 这样才是使用静态库的方法吧? 使用-l就默认为使用动态共享库了,所以我觉得你可以试试修改下makefile重新编译一次。
现在我自己写了几个功能函数,编译成一个静态库libfunc.a,然后想加入到这个程序里,在程序代码里调用我自定义的方法;
添加完我自己的静态库路径后,重新执行./configure --host=arm-linux,生成的makefile也都没有问题,会去链接我的库,(生成的makefile中CFLAGS里有-lfunc),make通过,我也确认程序里已经调用了libfunc.a里的函数(改下函数名报错,改为正确的ok)。
问题来了,so是生成了,但是运行示例程序时会报 undefined symbol:mytest,这个mytest就是我.a里定义的函数。
静态库使用时不是用-l的,你的makefile里面有-lfunc说明使用的不是你的静态库而是要使用libfunc.so动态库。
gcc *** -L** libfunc.a 这样才是使用静态库的方法吧? 使用-l就默认为使用动态共享库了,所以我觉得你可以试试修改下makefile重新编译一次。
|
http://user.qzone.qq.com/308337370?ptlang=2052&ADUIN=415823335&ADSESSION=1327891069&ADTAG=CLIENT.QQ.4087_FriendTip_QzoneFolder.0
这里有个过程, 给你推荐一下
这里有个过程, 给你推荐一下
|
应该是没有link上。。。
|
链接时候-l指定动态库生成二进制可执行程序。
运行时候会加载动态库, 但动态库的查找路径是由LD_LIBRARY_PATH这个环境变量决定的,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的so目录
就行了。
运行时候会加载动态库, 但动态库的查找路径是由LD_LIBRARY_PATH这个环境变量决定的,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的so目录
就行了。