动态库问题:dlsym() 找不到符号
dynamic library issue: dlsym() failing to find smbol
我一直在关注 Apple 的 动态库编程主题
使用 dlopen()
/ dlsym()
.
创建和使用 运行 时间加载库的文档
我似乎无法在我的 2012 年中期 MacBook Air 运行ning macOS Mojave 上找到所需的符号。
库源代码
// 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
有什么可能出错的想法,或者我需要做什么来调试这个问题?
谢谢!
C++ 实际上破坏了导致不同符号名的函数名。
您可以使用 nm -g <yourlib.dylib>
发现这些损坏的符号名称
您可以通过将您的方法包装到
中来改变这种行为
extern "C" {
int add(int x);
}
我一直在关注 Apple 的 动态库编程主题
使用 dlopen()
/ dlsym()
.
我似乎无法在我的 2012 年中期 MacBook Air 运行ning macOS Mojave 上找到所需的符号。
库源代码
// 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
有什么可能出错的想法,或者我需要做什么来调试这个问题? 谢谢!
C++ 实际上破坏了导致不同符号名的函数名。
您可以使用 nm -g <yourlib.dylib>
您可以通过将您的方法包装到
中来改变这种行为extern "C" {
int add(int x);
}