11

在带有 CMake 的 Linux 下,我正在构建一个共享库 libIex-2_0.so.10.0.1

ADD_LIBRARY (Iex SHARED
  [*.cpp]
)
SET_TARGET_PROPERTIES(Iex PROPERTIES OUTPUT_NAME "Iex-2_0")

10.0.1 版本设置为调用

SET_TARGET_PROPERTIES ( Iex
  PROPERTIES
  VERSION 10.0.1
  SOVERSION 10
)

在安装文件夹中,创建了这些链接

libIex-2_0.so -> libIex-2_0.so.10
libIex-2_0.so.10 -> libIex-2_0.so.10.0.1
libIex-2_0.so.10.0.1

但是,为了匹配使用另一个构建系统进行的先前构建,我需要添加一个旧的符号链接,去除 2_0 后缀:

libIex.so -> libIex-2_0.so.10.0.1

创建这样一个链接的正确 CMake 方法是什么?

4

2 回答 2

9

一种方法是使用 CMakeadd_custom_commandadd_custom_target。在您的情况下,它将类似于以下内容:

 SET( legacy_link   ${CMAKE_INSTALL_PREFIX}/libIex.so)
 SET( legacy_target ${CMAKE_INSTALL_PREFIX}/libIex-2_0.so.10.0.1)
 ADD_CUSTOM_COMMAND( OUTPUT ${legacy_link}
                     COMMAND ln -s ${legacy_target} ${legacy_link}
                     DEPENDS install ${legacy_target} 
                     COMMENT "Generating legacy symbolic link")

 ADD_CUSTOM_TARGET( install_legacy DEPENDS ${legacy_link} )

此时,您应该install_legacy在生成的 Makefile 中有一个目标,该目标具有正确的依赖项来生成libIex.so.

于 2013-09-11T06:51:14.200 回答
2

另一种方法是运行一些install(CODE shell-script). 顺便说一句,它确实正确地附加到了一般的“make install”目标。通过对 working_directory 的更好控制,也可以轻松地创建相对符号链接。

我也确实要求它make install DESTDIR=/buildroot可以工作,因此需要在调用 shell 脚本之前保持 $DESTDIR 未扩展。除了一些可移植性的魔力外,它看起来像这样:

get_target_property(libname MyLib OUTPUT_NAME)
get_target_property(libversion MyLib VERSION)
set(lib ${CMAKE_SHARED_LIBRARY_PREFIX})
set(dll ${CMAKE_SHARED_LIBRARY_SUFFIX})
install(CODE "execute_process(
    COMMAND bash -c \"set -e
    cd $DESTDIR/${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
    echo -n .. Installing: `pwd`
    ln -sv ${lib}${libname}${dll}.${libversion} ${lib}${libname}${dll}.11
    echo -n .. Installing: `pwd`
    ln -sv ${lib}${libname}${dll}.${libversion} ${lib}${libname}${dll}.12
    \")")

PS假设include ( GNUInstallDirs )在这里。

于 2018-09-13T22:52:55.003 回答