Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MacOS——如何使用gcc/ld将动态库与相对路径链接_Macos_Gcc_Linker_Ld_Dynamic Library - Fatal编程技术网

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

MacOS——如何使用gcc/ld将动态库与相对路径链接,macos,gcc,linker,ld,dynamic-library,Macos,Gcc,Linker,Ld,Dynamic Library,如果您试图了解动态链接,则可能会感兴趣 这个问题的一个答案提供了一个创建和使用动态库的极好示例。在此基础上,我创建了一些简单的文件: 主要条款c: extern void someFunction (int x); int main (int argc, char** argv ) { someFunction(666); } 我的图书馆c: #include <stdio.h> void someFunction (int x) { printf ("\nso

如果您试图了解动态链接,则可能会感兴趣

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

主要条款c:

extern void someFunction (int x);

int main (int argc, char** argv ) {
    someFunction(666);
}
我的图书馆c:

#include <stdio.h>

void someFunction (int x) {
    printf ("\nsomeFunction called with x=%d\n", x);
}
到目前为止,一切都很顺利。如果在命令提示下生成并输入./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执行时没有错误,但在运行时会显示“未找到库”


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

如果在链接后尝试移动对象,则需要一个
dyld
环境变量来搜索位置
mandyld
,您应该能够获得有关
dyld\u LIBRARY\u PATH
和其他环境变量的更多信息

但是,通常,在链接到具有
-install\u name
链接器标志的对象之前,将库的安装名称设置为
@rpath/mylibrary.dylib
作为值,然后在编译时将主可执行文件上的运行路径搜索路径设置为
-rpath
标记为
@executable\u path/hidelib

gcc -dynamiclib -install_name '$(CURDIR)/hidelib/libmylibrary.dylib' -current_version 1.0 mylibrary.o -o libmylibrary.dylib
有关更多信息,请参阅
install\u name\u工具
ld
-rpath
-install\u name
参数


基本上,您尝试执行的操作有很多选项。

一个具体可行的选项是在链接
.dylib
时设置
install\u 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
gcc main.o -L '$(CURDIR)/hidelib' -lmylibrary -o main