2013-06-25 2 views
4

Я сталкиваюсь с некоторыми трудностями в конфигурации cmake для dylib.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}) 

Test 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 является относительным.

Итак, если вы хотите исправить свою проблему, вам следует обновить идентификатор скопированной библиотеки. Это можно сделать с помощью install_name_tool:

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

Спасибо за информацию, я добавлю ее как команду post team на cmake. – PLL