4

dylib の cmake 構成で問題が発生しています。

これが私のテストです:

mylibfunc.cpp

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

基本テスト.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;
}

CMakeList :

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 

--> 各ライブラリには独自の静的カウントがあり、正常に動作します。

テスト 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  

--> 各ライブラリは同じカウンターを共有していましたが、これは私が望んでいるものではありません....

cmake または xcode のプロパティで何を変更すればよいですか?

4

1 に答える 1

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
于 2013-06-25T17:40:44.160 に答える