4

我们正在尝试使用 Linux、Solaris 等使用的共享库命名约定在 Mac OS X 上使用 CMake 构建共享库,也就是说,libfoo.so.1而不是libfoo.1.dylib. 这是一个内部部署,我们有一个现有的 Linux 部署,并希望在它之后对 Mac OS X 部署建模,这样就不必修改其他工具。

我可以.so改用.dylib

set_target_properties(OpenImageIO
                      PROPERTIES
                      SUFFIX .so)

但是,我无法正确订购。试

set_target_properties(OpenImageIO
                      PROPERTIES
                      OUTPUT_NAME libOpenImageIO.so.${SOVERSION})

最终build/macosx/libOpenImageIO/liblibOpenImageIO.so.32.1.2.0.so表明这OUTPUT_NAME仅适用于共享库的基本部分,CMake 将始终颠倒 SUFFIX 和 VERSION 的顺序。

我搜索了 CMake 的源代码,但找不到该代码的设置位置。

4

1 回答 1

8

将版本名称放在后缀前面的行为.dylib在方法中针对 Mac OS X 进行了硬编码cmTarget::ComputeVersionedName(请参阅 CMake 源文件 cmTarget.cxx)。

但是,您可以通过以下方式设置目标属性来欺骗 CMake 生成所需的名称:

if (APPLE)
    set_property(TARGET OpenImageIO PROPERTY PREFIX "lib")
    set_property(TARGET OpenImageIO PROPERTY OUTPUT_NAME "OpenImageIO.so")
    set_property(TARGET OpenImageIO PROPERTY SUFFIX "")
    set_property(TARGET OpenImageIO PROPERTY SOVERSION "32.1.2.0")
endif()
于 2013-02-16T13:59:08.173 回答