前言什么是RPATH?
在Linux环境下,使用动态链接的程序在运行时会自动链接 ld.so 这个库(OS X上是 dyld),然后通过 ld.so 来查找链接其它的库。而 RPATH 就是编译的时候链接到执行文件的链接库路径。OS X在 RPATH 的设置上和Linux还是有点出入的,OS X的 RPATH 采用的是绝对路径。
ld.so 搜索路径的优先级是这样的:
1. RPATH ,编译链接时加入 -rpath 参数指明所谓的 RUNPATH ,这样可执行文件(或者依赖其他动态链接库的动态链接库)就能告诉 ld.so 到哪里去搜索对应的动态链接库了。
2. LD_LIBRARY_PATH ,对于没有设定 RPATH 的可执行文件或者动态链接库,我们可以用 LD_LIBRARY_PATH 这个环境变量通知 ld.so 往哪里查找链接库。
3. /etc/ld.so.conf ,系统对 ld.so 的路径配置文件。
4. /usr/lib 、 /lib 和 /usr/local/lib ,系统默认路径。
场景
Linux编译MySQL5.7.30源码编译指定RPATH的路径为当前路径(.), 方便将编译的库文件移植到一台没有安装GCC7.0版本的系统上,因为默认的CentOS7.6采用的GCC是4.8版本,根本无法编译和运行MySQL5.7
方案
修改顶层目录文件CMakeLists.txt
72 # First, decide about build type (debug or release)
73 # If cmake is invoked with -DCMAKE_BUILD_TYPE,
74 # respect user wishes and do not (re)define CMAKE_BUILD_TYPE. If WITH_DEBUG
75 # is given, set CMAKE_BUILD_TYPE = Debug. Otherwise, use Relwithdebinfo.
76 SET(CMAKE_IN60dcSTALL_RPATH \”./\”)
77 IF(DEFINED CMAKE_BUILD_TYPE)
78 SET(HAVE_CMAKE_BUILD_TYPE TRUE)
79 ENDIF()
添加76行
附带编译指令
cmake ../ -DCMAKE_INSTALL_PREFIX=/opt/mysql -DMYSQL_DATADIR=/data/data -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_EMBEDDED_SERVER=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/src/boost/boost_1_59_0