先说明下:
我使用的是Xcode4.5+IOS6.0

为了把一些东西封装好,我自己弄了个静态库,编译啥都通过了,将模拟器下编译出来的.a库文件在其它工程(A)中引用,可以正常使用(模拟器情况下正常)。
可是把真机下编译出来的.a库文件在其它工程中引用,真机情况下就编译不过了。
报错:Undefined symbols for architecture armv7:
  "_WebRtcIlbcfix_DecoderCreate", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_EncoderFree", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_Decode", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_DecoderInit", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_DecodePlc", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_Encode", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_EncoderCreate", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_DecoderFree", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
  "_WebRtcIlbcfix_EncoderInit", referenced from:
      CMedia::Process(void*) in sxLibDial.a(media.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我在终端查看了,sxLibDial.a是armv7的。
求教各位,真机下应该如何编译和使用静态库?
先谢谢各位啦~~~~~

解决方案 »

  1.   

    模拟器是i386体系的,你确定是armv7编译出来的库?或者可能sxLibDial有其他库的依赖
      

  2.   


    是armv7编译出来的库。
    sxLibDial是依赖了另外一个库,我在sxLibDial里面引用了那个库(A)。<我以为可以这样可以把它们两个整成一个>
    之后我在我的工程里加入了那个库A,然后就编译通过了。
    不过,现在还是有一个疑问:为什么i386编译出来的就不用再引用库A可以直接使用,
    而armv7编译出来的库,还需要再引用库A呢?
    而且库A比较大,但报错的内容只涉及一个文件里的内容。
      

  3.   

    应该是没差别的,开始我是用模拟器编译出来的.a文件通过测试之后,
    我再用真机下编译出来的.a文件替换之前的那个模拟器编译出来的.a文件进行测试的。不过,不排除中间有其它因素影响,所以准备重新开始弄一次。
      

  4.   

    重新弄了一次,不论是模拟器还是真机下,都只需要引用一个静态库了(不需要在其它工程中再包含我上面所说的A库)。
    现在还有一点小小的问题是,真机下不支持armv7s,编译就报错。我在制作静态库时,后面是加了armv7s的。
    但还是不行。不知道要如何制作可以兼容armv7s的静态库。求解
    嘻嘻
      

  5.   

    楼主能不能给出你的方法呀,我也是在.a库 中包了别的地方的SDK这个时候单独拿出。A文件给别的工程的时候会出错,错的和你开始发的一样
      

  6.   


    首先,你要确定你包含的另一个SDK是不是i386和armv7两种架构都支持。
    其次,把另一个SDK加到你的库里面,这里有可能会涉及路径之类的。这一步不能搞混了。
    最后,编译通过你的库,看你是选模拟器编译出来的还是真机编译出来的。
    模拟器编译出来的只能用于模拟器,真机编译出来的只能用于真机。
    你可以用 lipo -info XXX.a 查看它是i386还是armv7.
    如果你想整出一个通用的库的话,可以使用命令 lipo -create A.a  B.a -output AB.a
    这样AB.a就是真机和模拟器上都可以用的了。对了,最后一点,你的SDK里面需要包含的其它系统库在你使用的工程里面都得加上去才行
      

  7.   

    我现在就是比较纠结的一点是加上引用的那些,查了资料有说用gcc命令加进工程的,但是在这测试一直没有成功,可能是路径的问题,还在试中,谢谢了。