【问题标题】:CMake Ubuntu set soname for shared objectCMake Ubuntu为共享对象设置soname
【发布时间】:2021-01-14 03:22:48
【问题描述】:

如何在 Ubuntu 中使用 CMake 为共享库设置 SONAME?

How to add linker flag for libraries with CMake? 的帮助下,我创建了一个 CMakeLists.txt:

project(mylib VERSION 1.2.3)

set(src_files_mylib
    Client.cpp      
    Server.cpp
    )
set(hdr_files_mylib
    Client.h
    Server.h
    )

add_library(mylib SHARED ${src_files_mylib} ${hdr_files_mylib})
set_target_properties(mylib PROPERTIES PREFIX "")
set_target_properties(mylib PROPERTIES SUFFIX "")
set_target_properties(mylib PROPERTIES OUTPUT_NAME "mylib.so.${PROJECT_VERSION}")
add_link_options("LINKER: -l,soname,mylib.so.${PROJECT_VERSION_MAJOR}")

使用 CMake 3.16 和非源代码构建。它生成名为 mylib.so.1.2.3 的库,但其中似乎没有 SONAME。在库目录中执行ldconfig -n . 时,不会产生链接。

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,soname,mylib.so.${PROJECT_VERSION_MAJOR}")

而不是

add_link_options("LINKER: -l,soname,mylib.so.${PROJECT_VERSION_MAJOR}")

对我的行为相同。

当手动编写 Makefile 时,目标是用这个正确构建的(像上面那样去ldconfig -n . 会产生一个链接):

(...)
MYLIB_SO=mylib.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
MYLIB_SONAME=mylib.so.$(VERSION_MAJOR)
(...)
$(MYLIB_SO): $(OBJ_MYLIB)
    $(CXX) $(SO_FLAGS) -Wl,-soname,$(MYLIB_SONAME) -o $(MYLIB_SO) $(DEBUGFLAGS) $(OBJ_MYLIB)

【问题讨论】:

  • 库的版本和排序由VERSIONSOVERSION 属性控制。请参阅that answer 了解它们的用法。

标签: linux cmake shared-libraries ubuntu-20.04


【解决方案1】:

如果库被称为 SoundTouch

project(SoundTouch VERSION 2.3.0 LANGUAGES CXX)

add_library(SoundTouch [SHARED]
    sources/animation.cpp
    sources/buffers.cpp
    [...]
)

set_target_properties(SoundTouch PROPERTIES VERSION ${CMAKE_PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR} )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多