【问题标题】:Where is libdl.so on Mac OS X?Mac OS X 上的 libdl.so 在哪里?
【发布时间】:2013-12-08 19:07:54
【问题描述】:

我对 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 在哪里?

如果它不存在,我如何获得它?

谢谢!

【问题讨论】:

    标签: c++ macos unix shared-libraries


    【解决方案1】:

    在 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() %s\n", name);
        else
            printf("Got handle %p from dlopen() for %s\n", 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
    $
    

    两者的地址相同,因此可能在幕后进行了一些映射。

    【讨论】:

      【解决方案2】:

      有一种独立于平台的方式来添加链接器标志,以使用dlopen。 Cmake提供variable CMAKE_DL_LIBS

      包含 dlopen 和 dlclose 的库的名称,在大多数 UNIX 机器上通常为 -ldl。

      人们可以使用它来代替手动搜索-ldl 并考虑平台差异:

      target_link_libraries(PLUGINS_FRAMEWORK PUBLIC ${CMAKE_DL_LIBS}) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-31
        • 2016-11-26
        • 2013-03-27
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多