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

时间:2018-11-13 20:01:55

标签: c++ dynamic-library

我一直在关注Apple的Dynamic Library Programming Topics 文档,以使用dlopen() / dlsym()创建和使用运行时加载的库。

似乎我在运行macOS Mojave的2012年中的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: %s\n\n", __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: %s\n\n", __FILE__, dlerror());
            exit(EXIT_FAILURE);
        }
        printf("%d\n", 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

关于什么可能是错误的,或者我需要做什么来调试此问题的任何想法? 谢谢!

1 个答案:

答案 0 :(得分:1)

C ++实际上会破坏函数名,导致产生不同的符号名。 您可以使用nm -g <yourlib.dylib>

找出这些变形的符号名称

您可以通过将方法包装到其中来更改此行为

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