编译跨架构OpenVPN时Shell脚本中configure库路径如何使用相对路径
OpenVPN通用编译脚本硬编码OpenSSL路径改造方案
之前把硬编码绝对路径换成
../Fat_openSSL/OpenSSLFatLibraries后编译失败的根本原因:autotools生成的./configure脚本在做编译环境检测时,会在独立的临时工作目录下运行测试编译命令,直接写在-L参数内的相对路径,会以测试命令所在的临时目录为基准解析,而不是你执行configure时的初始工作目录,因此根本找不到你存放的OpenSSL库。
适配现有脚本约定的改法(约定运行时工作目录为脚本所在目录的父文件夹)
- 无需修改现有运行规则,只要在脚本的configure命令执行前,先将目标OpenSSL库路径通过shell转成绝对路径,再传入configure参数即可
- 具体代码修改:
- 在脚本中
./configure命令的上一行,新增路径变量赋值:# 获取当前执行脚本时的工作目录(即约定的脚本父目录),拼出OpenSSL库的绝对路径 OPENSSL_LIB_ABS_PATH="$(pwd)/Fat_openSSL/OpenSSLFatLibraries" - 替换原有configure命令中的硬编码路径,使用上述变量:
./configure OPENSSL_LIBS="-L${OPENSSL_LIB_ABS_PATH} -lssl -lcrypto"
/Users/fofo/Desktop/...这类本地绝对路径,不管脚本被挪到哪个目录下,只要按照约定把工作目录切到脚本的父文件夹再执行,就能正常定位到OpenSSL库。 - 在脚本中
更鲁棒的扩展写法(无需手动切换工作目录)
- 如果后续想减少对运行者的操作要求,不需要再提前切到父文件夹执行脚本,可以在脚本开头自动定位脚本自身的存放位置,自动拼出正确的OpenSSL路径:
后续执行configure的参数和上面的写法保持一致即可,这种写法不管用户在哪个目录调用这个编译脚本,都能自动找到正确的库路径,同时完全适配Intel、Apple Silicon两种架构的编译流程,不需要针对不同架构修改路径配置。# 自动获取当前编译脚本自身的绝对存放路径 SELF_SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" # 基于脚本位置定位OpenSSL库的绝对路径(对应脚本父目录下的Fat_openSSL路径) OPENSSL_LIB_ABS_PATH="$(dirname "$SELF_SCRIPT_DIR")/Fat_openSSL/OpenSSLFatLibraries"
避坑提醒
- 不要尝试在configure命令的参数字符串里直接拼接相对路径,必须在shell层面提前完成绝对路径的解析,再把解析后的完整路径传入参数,否则还是会被configure内部的临时目录逻辑干扰。
- 后续追加Apple Silicon架构编译步骤时,不需要修改这套路径逻辑,shell的路径解析在两种架构上的表现完全一致。
内容的提问来源于stack exchange,提问作者Alfonso Tesauro
相关产品推荐
相关产品推荐

