2013-11-24 132 views
1

我對Mac很新,想編譯一些鏈接到libdl.so的代碼。Mac OS X上的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罰款然而libdl.so是不是有在Mac OS X 10.9。

Mac OS X上的libdl.so在哪裏?

如果它不在那裏,我該如何得到它?

謝謝!

回答

2

你不需要特殊的圖書館獲得dlopen()等在Mac OS X和共享對象.dylib.bundle結束在Mac OS X

此代碼,沒有額外的庫編譯:

#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中仍然支持。


注意的ldd在Mac OS X上的等價物是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 
$ 

這兩個地址是相同的,所以可能會有一些映射在幕後進行。