为什么编译成APP可以,编译成易语言静态编译修复器库却不行

帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:1&分页:Exp-Golomb发信人: eheh (一盏青灯,长伴古佛), 信区: LinuxDev
标&&题: [合集] 包含 dlopen() 的代码不能编译成静态库?
发信站: 水木社区 (Tue Aug 31 17:16:38 2010), 站内 && ☆─────────────────────────────────────☆ &&
diogin (design universe...) 于
(Sun Aug 29 21:30:06 2010)
提到: && 如题?原因是? &&&&&& ☆─────────────────────────────────────☆ &&
cugbcat (邦卡猫) 于
(Sun Aug 29 21:52:41 2010)
提到: && dl不就是动态库的简写么?? &&&&&&&& ☆─────────────────────────────────────☆ &&
qicha (七茶) 于
(Sun Aug 29 22:01:08 2010)
提到: && 可以,仔细描述你的问题,别乱猜 &&&&&&&&&& ☆─────────────────────────────────────☆ &&
diogin (design universe...) 于
(Sun Aug 29 22:10:05 2010)
提到: && 比如可执行程序 main 静态链接了 libone.a;
后者 dlopen 并调用了 libtwo.so 里的函数。 &&&&&&&&&& ☆─────────────────────────────────────☆ &&
scalarize (scalarize) 于
(Sun Aug 29 22:30:09 2010)
提到: && 你的 glibc 没有提供 dlopen 的静态库,libdl.a 里面只有符号,并在静态链接时报错 &&&&&&&&&& ☆─────────────────────────────────────☆ &&
qicha (七茶) 于
(Sun Aug 29 22:54:53 2010)
提到: && main是静态程序?那不可以的dlopen要利用ld.so来处理dso的,静态链接程序无法利用dlopen的.
当然你可以利用其它接口完成这样的功能. &&&&&&&&&& ☆─────────────────────────────────────☆ &&
diogin (design universe...) 于
(Sun Aug 29 23:04:29 2010)
提到: && 也就是说 dl 库依赖 ld.so 对吧,既然用了 ld.so 那自然走动态链接路线了。
因此 libdl 只有 .so 版本有意义,.a 版本没有意义。
使用 dl 的模块也只能动态链接 libdl.so。 && 这样理解对否? && 另外请教下关于 .a 和 .so 的一些关系: && 1. one.a 依赖 two.a
2. one.so 依赖 two.so
3. one.a 依赖 two.so
4. one.so 依赖 two.a
5. one.a 转成 one.so
6. one.so 转成 one.a && 以上 1~6 项里,哪些项是不可能(或不正确、没意义)的呢? &&&&&&&&&& ☆─────────────────────────────────────☆ &&
qicha (七茶) 于
(Sun Aug 29 23:11:15 2010)
提到: && 静态链接程序和程序连接静态库不是一回事,因此libdl.a还是有意义的.
glibc处理dso的功能都有,放在ld.so里面是最合理的地方。
当然即使静态链接程序也有办法启动ld.so再用dlopen处理其他so,但这不是标准做法。 &&&&&&&& ☆─────────────────────────────────────☆ &&
diogin (design universe...) 于
(Sun Aug 29 23:27:02 2010)
提到: && 我主要是想弄明白 .a 和 .so 相互之间是否可以依赖和转换。 && 比如“猜想”.so“依赖”.a 应该具体表现在编译 .so 时把 .a 拷贝到 .so 中去;
而 .a“依赖”.so,则表现在静态链接了 .a 的程序可以在运行时加载 .so,加载方法
可以是使用 dlopen(但这样这个 .a 就依赖 libdl 了,而 libdl 本身是 .so 还是 .a
又跟“猜想”本身有关系),或者就像您说的让静态链接程序自己实现 .so 的加载。 && 另外,最终程序也可以在编译时指定静态链接某些库、同时动态链接另外一些库对吧? &&&&&&&&&& ☆─────────────────────────────────────☆ &&
qicha (七茶) 于
(Sun Aug 29 23:37:13 2010)
提到: && 可以这样理解,liba依赖libb是指在liba中存在未定义的符号,而在libb中恰好有这样的定义。因此.a和.so之间都可以有依赖关系,1-4都没问题。
按常理来说.a是可以转换为.so的,而反过来不行。但这东西不是绝对的。
如果.a中包含的是noc-PIC代码,而你需要个PIC的.so,转换就没啥意义了。
也有人非要把.so中的符号和代码转换为.a,这也做到一些 &&&&&&&& ☆─────────────────────────────────────☆ &&
diogin (design universe...) 于
(Mon Aug 30 19:15:54 2010)
提到: && 大抵了解了。多谢 :-) &&&&&& 文章数:1&分页:Hi,欢迎来到中国嵌入式培训高端品牌 - 华清远见嵌入式学院,专注嵌入式工程师培养13年!
全国咨询热线:400-706-1880
当前位置: >
> Android导入第三方静态库.a编译成动态库.so
Android导入第三方静态库.a编译成动态库.so
时间:作者:华清远见
在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库。如果有源码的话,可以直接跟你自己的代码一去编译成动态库so,但是如果没有源码的话,你就必须在自己的动态库so里面将别人生成好的静态库导入进来一起编译了。我在编译的时候遇到了不少问题,我觉得有必要进行总结一下。
下面我以一个简单的实际例子来讲解如何在动态库中导入静态库。
静态库中的源代码有两个文件:static.h, static.c,有一个add方法
int add(int x, int y);
#include &static.h&
int add(int x, int y)
return x +
将它编译成静态库,Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := static_add
LOCAL_SRC_FILES := static.c
include $(BUILD_STATIC_LIBRARY)
注意编译静态库的时候,必须有一个Application.mk文件:
APP_MODULES:=static_add
APP_MODULES的值应该和Android.mk中的LOCAL_MODULE的值保持一样。
然后调用ndk-build进行编译生成libstatic_add.a静态库。
hejinlai_iMac:jni hejinlai$ ndk-build
Prebuilt : libstatic_add.a &= jni/
生成静态库后,然后编写动态库中的源代码: share.h share.c
int test_add(int x, int y);
1234567 #include &share.h&
#include &static.h&
int test_add(int x, int y)
// 调用static里面的方法
return add(x, y);
编写导入静态库的Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := static_add
LOCAL_SRC_FILES := libstatic_add.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := share_add
LOCAL_STATIC_LIBRARIES := static_add
LOCAL_SRC_FILES := share.c
include $(BUILD_SHARED_LIBRARY)
注意上面生成的libstatic_add.a必须跟Android.mk放在同一目录下,否则需要填写相应的路径,然后进行编译:
hejinlai_iMac:jni hejinlai$ ndk-build
Compile thumb : share_add &= share.c
Prebuilt : libstatic_add.a &= jni/
SharedLibrary : libshare_add.so
Install : libshare_add.so =& libs/armeabi/libshare_add.so
提示so编译成功。
需要注意的是我这边share.c和static.c放在同一目录下,如果放在不同的目录下,需要指定
LOCAL_C_INCLUDES链接到相应的路径
学院最新动态iOS生成静态库方法-iOS集成静态库-iOS合并静态库
在iOS的开发过程中,我们常常用到第三方的库。尤其是QQ、百度地图、广告等。
那么,如何制作自己的库文件呢?
如果,将自己写的功能类编译成库文件,分发给其他人来使用呢?
静态库的优点
编译静态库的好处也还是有的!
1.让自己的源码不被直接暴漏。
2.需要使用时,仅仅拷贝相应的.h文件和.a文件就好,不用在将源码一一拷贝。方便。
3.显得也比源码拷贝高端、大气一些。
那么,废话就不多说了!准备动工!
一、建立相应的静态库项目
这样,默认获得了项目同名的一组.h和.m文件。
熟悉吧,就在相应的文件中,写入功能函数!在本例子中,简单的直接写入相应的2个方法。
MyStaticLibraryDemo.h
@interface MyStaticLibraryDemo
: NSObject
(int)addMethodByFirst:(int)theFirst andSecond:(int)theS
(int)SubMethodByFirst:(int)theFirst andSecond:(int)theS
MyStaticLibraryDemo.m
"MyStaticLibraryDemo.h"
@implementation
MyStaticLibraryDemo
(int)addMethodByFirst:(int)theFirst andSecond:(int)theSecond{
& & return&
(theFirst+theSecond);
(int)SubMethodByFirst:(int)theFirst andSecond:(int)theSecond{
& & return&
(theFirst-theSecond);
要做的,就这么简单,然后,调试代码无误后,就可以进行编译了!
二、编译静态库文件:XXXX.a
方法一,直接编译(command+B)。
这时,会发现,libMyStaticLibraryDemo.a生成了!进入相应的编译目录,会看到:
ok,有两个目录下的文件是我们需要的。
Release-iphoneos:应用于真机的静态库文件。
Release-iphonesimulator:应用于模拟器调试的静态库文件。
我们需要使用终端命令来看一下生成的相应的.a文件的属性(测试环境为作者本机环境):
1.Release-iphoneos版本
bogon:~ zhangzhen$ cd
/Users/zhangzhen/Library/Developer/Xcode/DerivedData/MyStaticLibraryDemo-ciwnhcsbqgclkododazbmbmtdlfp/Build/Products/Release-iphoneos
bogon:Release-iphoneos zhangzhen$ lipo
-info libMyStaticLibraryDemo.a
Architectures in the fat file:
libMyStaticLibraryDemo.a are: armv7 armv7s
可见,编译的可执行的CPU环境为arm7、armv7s、arm64。
2.Release-iphonesimulator版本
bogon:~ zhangzhen$ cd
/Users/zhangzhen/Library/Developer/Xcode/DerivedData/MyStaticLibraryDemo-ciwnhcsbqgclkododazbmbmtdlfp/Build/Products/Release-iphonesimulator
bogon:Release-iphonesimulator zhangzhen$ lipo -info libMyStaticLibraryDemo.a
Architectures in the fat file:
libMyStaticLibraryDemo.a are: i386
可见,编译的可执行版本为i386 x86_64
三、使用静态库
在你的要使用太静态库的项目中导入libMyStaticLibraryDemo.a文件和include文件夹中的相应的所有.h头文件。
例如,我要在MyLibraryTest项目中,使用我上述编译好的静态库文件。
导入完成后,项目如下:
注意:你在真机调试和模拟器调试的时候,要替换相应的.a文件版本。
在需要使用该静态库的地方,导入相应的.h文件。你就可以使用了!
MyStaticLibraryDemo *myLibrary=[[MyStaticLibraryDemo
alloc] init];
& & int result= [myLibrary addMethodByFirst:5 andSecond:5];
& & NSLog(@"Result:%d",result);
& & result=[myLibrary
SubMethodByFirst:10 andSecond:5];
& & NSLog(@"Result:%d",result);
当然,你也可以,针对相应的用途来编译相应的.a静态库。
1.选择Edit
Scheme项:
2.使用Build
Configuration 来编译相应的用途版本:
这样,你就可以得到相应用途的静态库编译版本。
如果,你在使用中,很不幸的遇到了以下问题:
ld: warning: ignoring file
/Users/XXXX/Documents/MyLibraryTest/MyLibraryTest/MyLibrary/libMyStaticLibraryDemo.a,
missing required architecture i386 in
file /Users/XXXX/Documents/MyLibraryTest/MyLibraryTest/MyLibrary/libMyStaticLibraryDemo.a
(3 slices)
Undefined symbols for architecture
"_OBJC_CLASS_$_MyStaticLibraryDemo", referenced
& objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
那么,我也很不幸的告诉你,你导入错误的编译版本。
以上错误,是你的库文件(.a)为真机版本,你却用模拟器来调试程序。将调试目标换成真机,即可!
四、合并静态库(真机+模拟器)
如果,你的调试需要不断在真机和模拟器之间切换。那么,制作一个通用的静态库.a文件是一个好想法。
这样,使用该静态库文件就可以在真机和模拟器上调试。
制作过程也是非常简单。动手吧:
1.使用终端合并2个版本。
bogon:~ zhangzhen$
lipo -create /所在路径/Release-iphoneos/libMyStaticLibraryDemo.a
/所在路径/Release-iphonesimulator/libMyStaticLibraryDemo.a
-output /Users/zhangzhen/Desktop/libUniversal.a
bogon:~ zhangzhen$&
这样,就可以合并一个通用版本的静态库。唯一不爽的,就是体积要大一些。
通用版本大小&=模拟器版本大小+真机版本大小。
2.集成通用静态库
我想,不用我介绍太多了,将以上合并的通用版本的静态库文件(libUniversal.a)拖入项目中。即可。这时候,你的静态库,可以使用真机+模拟器。
至此,iOS制作静态库的方法,就介绍到这里了!至于使用哪一种?如何使用?是否需要合并……那就要具体问题,具体分析了!
希望对你有所帮助!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 linux 编译静态库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信