clang, change dependent shared library install name at link time

后端 未结 1 1623
误落风尘
误落风尘 2020-12-05 16:18

Related, but do not answer the question:

  • How do I modify the install name of a .dylib at build time

On OSX, I have a dynamic library provided by

相关标签:
1条回答
  • 2020-12-05 16:24

    I've been hitting my head against this for some time and think I have finally figured out how to do this without using install_name_tool, at least for Mac OS 10.9 and later (as far as I've tested).

    While you may have already figured this out, I'm posting it here in case anyone else needs it.

    Basically you have two options:

    1. You can do it when you compile the library, defining its install_name in terms of @executable_path
    ROOT=$PWD
    mkdir $ROOT/foo
    mkdir $ROOT/bar
    
    cd $ROOT/foo
    echo 'int foo(int a, int b){return a+b;}' > foo.c
    clang foo.c -dynamiclib -install_name @executable_path/../foo/libfoo.dylib -o libfoo.dylib
    
    cd $ROOT/bar
    echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
    clang main.c -L../foo -lfoo -o main
    
    ./main
    echo $?
    # output is '6'
    
    1. Or you can do it in two steps using @rpath, which you then set when you compile the executable:
    ROOT=$PWD
    mkdir $ROOT/foo
    mkdir $ROOT/bar
    
    cd $ROOT/foo
    echo 'int foo(int a, int b){return a+b;}' > foo.c
    clang foo.c -dynamiclib -install_name @rpath/libfoo.dylib -o libfoo.dylib
    
    cd $ROOT/bar
    echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
    clang main.c -L../foo -lfoo -rpath @executable_path/../foo/ -o main
    
    ./main
    echo $?
    # output is '6'
    

    The end result will be the same in both cases:

    bar $ otool -L main
    main:
      @executable_path/../foo/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
      /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    

    The second one is probably preferable, since then you can compile the library once, and have any executable that uses it define where it will load it from using its own rpath.

    Please check here for detailed explanations of @executable_path, @rpath and @load_path (which I did not use here).

    0 讨论(0)
提交回复
热议问题