Mac OS X上的libdl.so在哪里

Where is libdl.so on Mac OS X?

本文关键字:so 在哪里 libdl 上的 OS Mac      更新时间:2023-10-16

我对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})