动态库问题:dlsym()找不到smbol



我一直在关注苹果的动态库编程主题docs使用dlopen()/dlsym()创建和使用运行时加载的库。

我似乎在2012年年中运行macOS Mojave的MacBook Air上找不到想要的符号。

库源代码

// adder.h
int add(int x);

// adder.cpp
#include "adder.h"
int add(int x) {
    return (x + 1);
}

clang -dynamiclib adder.cpp -o libAdd.A.dylib 编译

主要来源

// main.cpp
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include "adder.h"
int main() {
    void* adder_handle = dlopen("libAdd.A.dylib", RTLD_LOCAL|RTLD_LAZY);
    if (!adder_handle) {
        printf("[%s] Unable to load library: %snn", __FILE__, dlerror());
        exit(EXIT_FAILURE);
    }
    while(true) {
        void* voidptr = dlsym(adder_handle, "add");
        int (*add)(int) = (int (*)(int))voidptr;
        if (!add) {
            printf("[%s] Unable to get symbol: %snn", __FILE__, dlerror());
            exit(EXIT_FAILURE);
        }
        printf("%dn", add(0));
    }
    dlclose(adder_handle);
    return 0;
}

clang main.cpp -o main 编译

我还设置了DYLD_LIBRARY_PATH环境变量,以确保可以找到库。一切正常。

然而,当我运行主可执行文件时,我会得到错误:

[main.cpp] Unable to get symbol: dlsym(0x7fb180500000, add): symbol not found 

运行nm -gC libAdd.A.dylib输出:

0000000000000fa0 T add(int)
                 U dyld_stub_binder

关于什么可能是错误的,或者我需要做些什么来调试这个问题,有什么想法吗?谢谢

C++实际上破坏了函数名,从而导致不同的符号名。您可以使用nm -g <yourlib.dylib> 发现这些损坏的符号名称

你可以通过将你的方法包装到中来改变这种行为

extern "C" {
   int add(int x);
}

相关内容

  • 没有找到相关文章

最新更新