c++ - CMake 和 Dylib : symbol definitions

标签 c++ cmake shared-libraries dylib

我在为 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;
}

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 

--> 每个库都有自己的静态计数,工作正常。

使用 cmake 测试 2:

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 属性中更改什么?

最佳答案

我会尽量给你一个完整的答案,但有几点我不确定是否完全理解,所以......

首先,“手动”构建的库与 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

关于c++ - CMake 和 Dylib : symbol definitions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17295822/

相关文章:

c++ - 为什么这段代码会泄露?

c++ - 验证用户的输入以确保它是二进制的 (C++)

c++ - cmake 类似于 qmake 字符串文字

c++ - 如何在CMake中为 native 代码和外部代码设置不同的编译器警告级别

c++ - 缺少 cudart64_80.dll

c++ - 从 dll 使用 gdi+ 时进程不退出

c++ - 如何在 C++ 中使用 boost 制作正则表达式?

java - 在没有时间源的情况下,Android源码的哪一部分决定了Android的初始时间?

c++ - 在 Ubuntu 9.10 上使用 Qt 编译共享库

c - Linux共享对象编译问题