我是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在哪里?
如果不存在,我该如何获得它?
谢谢!
答案 0 :(得分:2)
在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
$
两者的地址相同,因此可能会在幕后进行一些映射。
答案 1 :(得分:0)
有使用平台独立的方法来添加使用dlopen
所必需的链接器标志。 Cmake提供了variable CMAKE_DL_LIBS
:
其中包含dlopen和dlclose的库的名称,在大多数UNIX计算机上通常为-ldl。
可以使用它代替手动搜索-ldl
并考虑平台差异:
target_link_libraries(PLUGINS_FRAMEWORK PUBLIC ${CMAKE_DL_LIBS})