背景:
在加载打印机的动态库libDSThermal.so时候,尝试各种方法的编译,就是编译不通过。
最后不断尝试,终于发现,qt项目最终生成的lib的话就能编译通过,但是生成app的话,就会有问题,编译不过。
原来是libDSThermal.so这个库依赖libfreeimage.so.3,但是又找不到。但是这个库都已经放在指定的路径下。这就是问题。
其实这个报错也给自己提示了,因为当涉及到共享库(shared libraries)时,找不到库的话,要得自己手动指定运行时和链接时得库搜索路径。
-rpath 和 -rpath-link 是两个常用的链接器(linker)选项,它们分别用于指定运行时和链接时的库搜索路径。
在 Qt 项目文件(.pro 文件)中,你可以通过 QMAKE_LFLAGS
变量来添加这些链接器选项。例如:
# 添加运行时库搜索路径
QMAKE_LFLAGS += -Wl,-rpath,/path/to/your/libs
# 如果需要在链接时也指定搜索路径(通常用于解决链接时找不到库的问题)
# 注意:这通常不是必需的,除非链接器在链接时找不到库
QMAKE_LFLAGS += -Wl,-rpath-link,/path/to/your/libs
然而,需要注意的是,-rpath-link 通常不是必需的,除非你在链接时遇到了找不到库的问题,并且你确定链接器在链接过程中需要访问这些库。在大多数情况下,只需设置 -rpath 就足够了,因为它会确保在运行时能够找到所需的共享库。
另外,如果你使用的是相对路径或者想要将库路径嵌入到可执行文件中(例如,使用 $ORIGIN),你可以这样做:
# 使用 $ORIGIN 指定相对于可执行文件位置的路径
QMAKE_LFLAGS += -Wl,-rpath,'\$ORIGIN/../libs'
在这个例子中,$ORIGIN 会被替换为可执行文件的实际路径,因此 ../libs 会指向可执行文件父目录的 libs 子目录。注意,在 -rpath 选项中,路径中的 $ 符号需要被转义(即使用 \$),以避免在 qmake 处理 .pro 文件时被解释为变量。