使用dylib C ++时未定义的体系结构符号

时间:2016-03-30 15:21:21

标签: xcode cocoa linker dylib

这是我创建dylib并使用它的程序,请帮助我,我是dylib的新手。

我在xcode中为c ++创建dylib我给了安装目录@rpath 这是我的C ++代码

Add.hpp:

#define EXPORT __attribute__((visibility("default")))
class Add
{
public:
    EXPORT void HelloWorld(const char *);
    EXPORT int AddTwo(int a,int b);
};

Add.cpp:

void Add::HelloWorld(const char * s)
{
     AddPriv *theObj = new AddPriv;
     theObj->HelloWorldPriv(s);
     delete theObj;
};
int Add::AddTwo(int a, int b)
{
    return a+b;
}

在构建阶段使用复制文件在其他项目中创建dylib后,将其复制到Frameworks,我可以在Sample.App/Contents/Frameworks/Mylib.dylib中看到它。在构建设置中,运行路径搜索路径设置为@executable_path/../Frameworks。我在标题搜索路径 $(SRCROOT)

中添加了根文件夹中的标题

我得到的错误是:

Undefined symbols for architecture x86_64:
  "Add::AddTwo(int, int)", referenced from:
      -[ViewController viewDidLoad] in ViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

编辑:

$ nm -gU ****/AddTest.app/Contents/Frameworks/libAdd.dylib 
0000000000001170 T __ZN3Add10HelloWorldEPKc
0000000000001220 T __ZN3Add6AddTwoEii

能够看到lib和otool输出中的符号是:

$ otool -L libAdd.dylib 
    @rpath/libAdd.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

1 个答案:

答案 0 :(得分:0)

通过在构建阶段将库添加到链接二进制文件库来解决