AccumPlus Asked:2020-08-31 18:59:44 +0000 UTC2020-08-31 18:59:44 +0000 UTC 2020-08-31 18:59:44 +0000 UTC 将动态库链接到可执行文件 772 我正在为使用第三方动态库的项目编写 Makefile。该库位于默认列表中未包含的特定目录中。 编译成功。显然,启动时出现问题 - 它找不到库。 是否可以编写一个 Makefile 来执行与 CMake 中的 link_directories 相同的功能?也就是说,库的路径被“硬连线”到可执行文件中。 unix 2 个回答 Voted Best Answer sercxjo 2020-09-01T03:41:46Z2020-09-01T03:41:46Z 根据man ld链接器,您需要将参数告知-rpath=тот_самый_путь需要缝入二进制文件的库。这可以通过两种方式完成。通过 gcc 选项-Xlinker -rpath=тот_самый_путь。如果您使用 make 的默认构建规则,LDFLAGS则 Makefile 中的变量适合这些选项: LDFLAGS+= -Xlinker -rpath=тот_самый_путь 第二种方法是在 -rpath 选项不可用时绕过它自己读取gcc的环境变量。在 Makefile 中,您可以这样写:LD_RUN_PATHld export LD_RUN_PATH=тот_самый_путь 或者直接在链接规则中写LD_RUN_PATH=тот_самый_путьbefore 。$(CC) 该路径可能包含子字符串$ORIGIN,它将被替换为包含可执行文件的目录的路径。看man ld-linux.so。Makefile 中的示例行: myprogram: LDFLAGS+= -Xlinker -rpath='$$ORIGIN/' myprogram: myprogram.o aleksandr barakin 2020-08-31T19:43:59Z2020-08-31T19:43:59Z 据我了解,该问题与make程序(以及cmake )无关。 因为link_directories是在编译时运行的汇编程序的指示。 你想指示装载机。但是系统加载器在启动时(即,甚至在程序执行之前)会根据可执行文件中指定的名称在它(加载器)配置为查找它们的那些目录中查找库。您可以使用 ldconfig程序重新配置引导加载程序(参见参考资料man ldconfig)。 无需重新配置引导加载程序,您可以使用环境变量给出这样的指示,例如,不直接运行程序,而是使用您方便的任何编程语言(例如,shell 语言)编写的脚本,在其中调用您的程序,使用环境变量LD_LIBRARY_PATH(路径)指定您的库的路径: LD_LIBRARY_PATH=путь программа 这样库的路径就“硬连接”到可执行文件中 您可以使用dlopen().
根据
man ld链接器,您需要将参数告知-rpath=тот_самый_путь需要缝入二进制文件的库。这可以通过两种方式完成。通过 gcc 选项-Xlinker -rpath=тот_самый_путь。如果您使用 make 的默认构建规则,LDFLAGS则 Makefile 中的变量适合这些选项:第二种方法是在 -rpath 选项不可用时绕过它自己读取
gcc的环境变量。在 Makefile 中,您可以这样写:LD_RUN_PATHld或者直接在链接规则中写
LD_RUN_PATH=тот_самый_путьbefore 。$(CC)该路径可能包含子字符串
$ORIGIN,它将被替换为包含可执行文件的目录的路径。看man ld-linux.so。Makefile 中的示例行:据我了解,该问题与make程序(以及cmake )无关。
因为link_directories是在编译时运行的汇编程序的指示。
你想指示装载机。但是系统加载器在启动时(即,甚至在程序执行之前)会根据可执行文件中指定的名称在它(加载器)配置为查找它们的那些目录中查找库。您可以使用 ldconfig程序重新配置引导加载程序(参见参考资料
man ldconfig)。无需重新配置引导加载程序,您可以使用环境变量给出这样的指示,例如,不直接运行程序,而是使用您方便的任何编程语言(例如,shell 语言)编写的脚本,在其中调用您的程序,使用环境变量
LD_LIBRARY_PATH(路径)指定您的库的路径:您可以使用
dlopen().