Mac OS X上的libdl.so在哪里
Where is libdl.so on Mac OS X?
我对Mac很陌生,正在尝试编译一些链接到libdl.so.的代码
我使用CMake来配置我的项目,在我的CMakeList中我有:
IF(UNIX)
FIND_LIBRARY(LIBDL_LIB NAMES libdl.so
PATHS /usr/lib/ usr/lib64/)
TARGET_LINK_LIBRARIES(PLUGINS_FRAMEWORK ${LIBDL_LIB})
ENDIF(UNIX)
这在Ubuntu上运行良好,但在Mac OS X 10.9上没有libdl.so。
Mac OS X上的libdl.so在哪里?
如果它不在那里,我该怎么得到它?
谢谢!
在Mac OS X上获取dlopen()
等不需要特殊的库。共享对象在Mac OS X.上以.dylib
或.bundle
结尾。
这段代码编译时没有额外的库:
#include <dlfcn.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char *name = "libc.dylib";
if (argc > 1)
name = argv[1];
void *dlh = dlopen(name, 0);
if (dlh == 0)
printf("Failed to dlopen() %sn", name);
else
printf("Got handle %p from dlopen() for %sn", dlh, name);
dlclose(dlh);
return 0;
}
它运行并生产:
Got handle 0x7fff624e9378 from dlopen() for libc.dylib
编译:
gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror dl.c -o dl
我在Mac OS X 10.9 Mavericks上使用GCC 4.8.2,但在任何仍支持的Mac OS X版本上,答案都是一样的。
请注意,在Mac OS X上相当于ldd
的是otool -L
,它产生:
$ otool -L dl
dl:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/usr/gcc/v4.8.2/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
$
我不知道打开libc.dylib
的幕后魔法或诡计意味着什么。但是:
$ ./dl libSystem.B.dylib
Got handle 0x7fff6e398378 from dlopen() for libSystem.B.dylib
$ ./dl
Got handle 0x7fff690d2378 from dlopen() for libc.dylib
$
两者的地址都是一样的,所以可能有一些映射在幕后进行。
有一种独立于平台的方法可以添加使用dlopen
所需的链接器标志。Cmake提供变量CMAKE_DL_LIBS
:
具有dlopen和dlclose的库的名称,在大多数UNIX计算机上通常为-ldl。
可以使用它来代替手动搜索-ldl
并考虑平台差异:
target_link_libraries(PLUGINS_FRAMEWORK PUBLIC ${CMAKE_DL_LIBS})
相关文章:
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 模板参数在 C++ 中存储在哪里?
- 我的重复检查代码中的错误究竟在哪里?
- bazel 项目将其".so"文件存储在哪里?
- Mac OS X上的libdl.so在哪里