2013-06-25 38 views
4

我在dylib的cmake配置上遇到了一些困难。CMake和Dylib:符号定义

这是我的测试:

mylibfunc.cpp

#include <stdio.h> 
static int count = 0; 
extern "C" 
{ 
    int mylibfunc() 
    { 
     count++; 
     return count; 
    } 
} 

basictest.cpp

#include <stdio.h> 
#include <dlfcn.h> 
#include <mach-o/dyld.h> 
typedef int (*funcPtr)(); 

int main() 
{ 
// Load first library 
void* handleA = dlopen("libmylib.dylib", RTLD_LAZY); 
funcPtr functionA = (int(*)())dlsym(handleA, "mylibfunc"); 
fprintf(stderr, "Handle A: %p\tFunction A: %p\t Count: %d\n", handleA, functionA, (*functionA)()); 

// Reload same library 
void* handleB = dlopen("libmylib.dylib", RTLD_LAZY); 
funcPtr functionB = (int(*)())dlsym(handleB, "mylibfunc"); 
fprintf(stderr, "Handle B: %p\tFunction B: %p\t Count: %d\n", handleB, functionB, (*functionB)()); 

// Load copy of first library (just rename) 
void* handleC = dlopen("libmylib_copy.dylib", RTLD_LAZY); 
funcPtr functionC = (int(*)())dlsym(handleC, "mylibfunc"); 
fprintf(stderr, "Handle C: %p\tFunction C: %p\t Count: %d\n", handleC, functionC, (*functionC)()); 

return 0; 
} 

CMakeLists:命令行

cmake_minimum_required(VERSION 2.8.11) 
SET(src_dir mylibfunc.cpp) 
add_library(mylib SHARED ${src_dir}) 
target_link_libraries(mylib ${EXTRA_LIBS}) 

测试1:

clang++ -dynamiclib mylibfunc.cpp -o libmylib.dylib 
cp libmylib.dylib libmylib_copy.dylib 
clang++ basictest.cpp -o basictest 
./basictest 

输出:

Handle A: 0x7fba614039b0 Function A: 0x10f7a5f50 Count: 1 
Handle B: 0x7fba614039b0 Function B: 0x10f7a5f50 Count: 2 
Handle C: 0x7fba61403de0 Function C: 0x10f7d8f50 Count: 1 

- >每个lib中有自己的静态计数值,做工精细。

测试2通过CMake:

cmake -G"Xcode" 
open Project.xcodeproj and build project on xcode 4 
cp libmylib.dylib libmylib_copy.dylib 
clang++ basictest.cpp -o basictest 
./basictest 

输出:

Handle A: 0x7ff5424039b0 Function A: 0x104a63f50 Count: 1 
Handle B: 0x7ff5424039b0 Function B: 0x104a63f50 Count: 2 
Handle C: 0x7ff5424039b0 Function C: 0x104a63f50 Count: 3 

- >每个LIB共享相同的计数器,这是不是我想要的....

什么我应该更改cmake或xcode属性?

回答

2

我会尽力给你一个答案尽可能完整,但有几个点我不知道要充分了解,所以......

首先,库之间的差异内置“手动“和由CMake构建的那些。前者的标识符为相对路径时,这是一个绝对的对后,你可以看到,otool

otool -D libmylib.dylib 

那将是/something/libmylib.dylib的CMake的构建和libmylib.dylib用于建造手册。 当然,当您复制dylib时,标识符保持不变。

因此,在使用绝对路径时,出于某种原因(是的,这是我不明白的部分),动态加载器明白这两个dylib文件是相同的,因为它们具有相同的id,并且不是当id是相对的时候。

所以,如果你想解决你的问题,你应该更新复制库的标识符。这可以使用install_name_tool

install_name_tool -id "libmylib_copy.dylib" libmylib_copy.dylib 
+0

感谢您的信息,我将它添加为cmake上的post命令构建。 – PLL