gpt4 book ai didi

MacOS——如何使用 gcc/ld 将动态库链接到相对路径

转载 作者:行者123 更新时间:2023-12-02 06:22:23 29 4
gpt4 key购买 nike

如果您想了解动态链接,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

最佳答案

一个有效的具体选项是在链接 .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

关于MacOS——如何使用 gcc/ld 将动态库链接到相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021428/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com