【问题标题】:MacOS -- how to link a dynamic library with a relative path using gcc/ldMacOS——如何使用 gcc/ld 将动态库与相对路径链接
【发布时间】:2012-04-18 18:28:11
【问题描述】:

如果您想了解动态链接,this question 可能会引起您的兴趣。

该问题的一个答案提供了一个创建和使用动态库的精彩示例。在此基础上,我做了一些简单的文件:

main.c:

extern void someFunction (int x);

int main (int argc, char** argv ) {
    someFunction(666);
}

mylibrary.c:

#include <stdio.h>

void someFunction (int x) {
    printf ("\nsomeFunction called with x=%d\n", x);
}

制作文件:

main: mylibrary.c main.c
    gcc -c mylibrary.c
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
    gcc -c main.c
    gcc -v main.o ./libmylibrary.dylib -o main

clean:
    rm *.o
    rm main
    rm *.dylib

到目前为止,一切都很好。如果我 make 然后在命令提示符下输入 ./main,我会看到预期的输出:

someFunction called with x=666

现在,我想稍微混淆一下。我创建了一个目录 hidelib,它是我的主目录的子目录。我在我的 makefile 中添加了一行:

main: mylibrary.c main.c
    gcc -c mylibrary.c
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
    gcc -c main.c
    mv libmylibrary.dylib hidelib     # this is the new line

clean:
    rm *.o
    rm main
    rm hidelib/*.*

现在,我想在 makefile 中添加另一行,以便在 hidelib 子目录中找到 libmylibrary.dylib。我希望能够以相同的方式运行 ./main。我该怎么做?

编辑:感谢您的回复。有很多选择固然很棒,但初学者只想要一个可行的具体选择。这是我在最后一行尝试的内容,但显然我不明白。 makefile 执行时没有错误,但在运行时显示“找不到库”。

    gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main

【问题讨论】:

    标签: macos gcc linker ld dynamic-library


    【解决方案1】:

    一个可行的具体选项是在链接.dylib 时设置install_name 标志。

    gcc -dynamiclib -install_name '$(CURDIR)/hidelib/libmylibrary.dylib' -current_version 1.0 mylibrary.o -o libmylibrary.dylib
    

    那么你就可以正常链接到库了:

    gcc main.o -L '$(CURDIR)/hidelib' -lmylibrary -o main
    

    【讨论】:

      【解决方案2】:

      您可能需要-L 编译器/链接器标志,它会添加到库的搜索路径中。

      在链接后尝试移动内容,您需要一个 dyld 环境变量来搜索搜索位置。 man dyld,您应该能够获得有关 DYLD_LIBRARY_PATH 和其他环境变量的更多信息。

      不过,通常情况下,在链接到带有 -install_name 链接器标志的东西之前,您先设置库的安装名称,然后将其设置为类似 @rpath/mylibrary.dylib 的值,然后在编译时在主可执行文件上设置运行路径搜索路径将-rpath 标记为@executable_path/hidelib

      有关详细信息,请参阅 install_name_toolld-rpath-install_name 参数。

      基本上,您尝试做的事情有很多选择。

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 2013-03-19
        • 2018-11-06
        • 1970-01-01
        • 2019-07-17
        • 2013-02-01
        • 2020-02-27
        • 1970-01-01
        相关资源
        最近更新 更多