Search code examples
c++xcodedylibdynamic-loading

c++ loading dylib functions at runtime error


So I'm trying to load a .dylib file at runtime in c++ and calling a function within it. It does not seem to be any problem loading the file but when i try to create a function-pointer to the "print" function it's result is NULL.

Here is my code:

/* 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;
}

test dylib headerfile

/* test.hpp */

#ifndef test_hpp
#define test_hpp

void print(const char * str);

#endif

the dylib c++ file

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

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

the output when running is:

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

I am quite new to c++ and have never loaded dylibs before. Any help would be much appreciated!


Solution

  • Try qualifying the print function declaration with extern "C" to get around the name mangling that is likely going on.

    Here's a nice article on the topic: http://www.tldp.org/HOWTO/C++-dlopen/theproblem.html (solution discussion on page following)