Theos 链接错误

用theos创建了一个Application,需要调用一个纯C写的dylib,编译能正常通过,在链接的时候报如下错误:

Making all for application PacketCaptureDemo001...
 Copying resource directories into the application wrapper...
 Compiling main.m...
 Compiling PacketCaptureDemo001Application.mm...
 Compiling RootViewController.mm...
 Linking application PacketCaptureDemo001...
Undefined symbols for architecture armv7s:
  "mt_vqmon_run()", referenced from:
      -[PacketCaptureDemo001Application applicationDidFinishLaunching:] in PacketCaptureDemo001Application.mm.4a9f2d30.o
  "mt_vqmon_init(int, char const*)", referenced from:
      -[PacketCaptureDemo001Application applicationDidFinishLaunching:] in PacketCaptureDemo001Application.mm.4a9f2d30.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [obj/PacketCaptureDemo001.app/PacketCaptureDemo001.ba964c90.unsigned] Error 1
make[1]: *** [internal-application-all_] Error 2
make: *** [PacketCaptureDemo001.all.application.variables] Error 2
    mt_vqmon_init(int, char const*) 和 mt_vqmon_run() 在dylib中定义,Makefile中已经添加了对dylib的链接:
VideoMonitor_LDFLAGS = -lmt

并且包含了armv7s架构:

这个简单工程的目录结构如附件图:


试了一下用纯C在theos下面写了一个dylib,出现同样的问题。 求教大神,究竟是怎么回事?不胜感激

这2个函数应该是私有的吧?
你要把它们声明为外部函数,类似于

extern mt_vqmon_run(xxx);

加了extern还是一样的效果,不知道为什么。不过可以通过动态加载的方式来调用(dlopen和dlsym),但是这样调用后,dylib里面的log没输出来,希望狗神能指点指点。。。

加了extern还是没用的话,说明编译的时候没去Theos目录下找这个lib,要么添加一下路径,要么就用dlopen吧
没输出,你得看看是dlopen什么的失败了,还是dylib本身的问题啊

加了extern还是没用的话,说明编译的时候没去Theos目录下找这个lib,要么添加一下路径,要么就用dlopen吧
没输出,你得看看是dlopen什么的失败了,还是dylib本身的问题啊

原来是我的extern加错了,在引用动态库的头文件里加上

#if defined __cplusplus
extern "C" {
#endif
    
    //代码
    
#if defined __cplusplus
};
#endif

就可以了,来告诉编译器这是一个C函数而不是C++函数。具体参考了这篇问答贴:[http://stackoverflow.com/questions/9334650/linker-error-calling-c-function-from-objective-chttp://stackoverflow.com/questions/9334650/linker-error-calling-c-function-from-objective-c](http://stackoverflow.com/questions/9334650/linker-error-calling-c-function-from-objective-c)

哦,我没注意你这2个函数是定义在了mm文件里,这样的话是确实要写成

extern "C"

;如果是定义在m文件里,那么只要写成

extern

就好了

恩,多些狗神,又遇到一个奇怪的问题不知道怎么办,求指点:http://bbs.iosre.com/t/root-app/804