c ++在运行时加载dylib函数错误

时间:2017-04-03 12:21:17

标签: c++ xcode dylib dynamic-loading

所以我试图在运行时在c ++中加载.dylib文件并调用其中的函数。加载文件似乎没有任何问题,但是当我尝试创建一个指向" print"的函数指针时。功能它的结果是NULL。

这是我的代码:

/* main.cpp */

#include <iostream>
#include <string>
#include <dlfcn.h>
#include "test.hpp"

int main(int argc, const char * argv[]) {
    std::string path = argv[0];
    std::size_t last = path.find_last_of("/");

    // get path to execution folder
    path = path.substr(0, last)+"/";

    const char * filename = (path+"dylibs/libtest.dylib").c_str();

    // open libtest.dylib
    void* dylib = dlopen(filename, RTLD_LAZY);

    if (dylib == NULL) {
        std::cout << "unable to load " << filename << " Library!" << std::endl;
        return 1;
    }

    // get print function from libtest.dylib
    void (*print)(const char * str)= (void(*)(const char*))dlsym(dylib, "print");

    if (print == NULL) {
        std::cout << "unable to load " << filename << " print function!" << std::endl;
        dlclose(dylib);
        return 2;
    }

    // test the print function
    print("Herro Word!");

    dlclose(dylib);
    return 0;
}

测试dylib头文件

/* test.hpp */

#ifndef test_hpp
#define test_hpp

void print(const char * str);

#endif

dylib c ++文件

#include <iostream>
#include "test.hpp"

void print(const char * str) {
    std::cout << str << std::endl;
}

运行时的输出是:

unable to load /Users/usr/Library/Developer/Xcode/DerivedData/project/Build/Products/Debug/dylibs/libtest.dylib print function!
Program ended with exit code: 2

我对c ++很新,从未加载过dylibs。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

尝试使用printextern "C"函数声明进行限定,以解决可能发生的名称错误。

这里有一篇关于这个主题的好文章:http://www.tldp.org/HOWTO/C++-dlopen/theproblem.html(关于页面的解决方案讨论)