【发布时间】: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)
【问题讨论】:
-
库的版本和排序由
VERSION和SOVERSION属性控制。请参阅that answer 了解它们的用法。
标签: linux cmake shared-libraries ubuntu-20.04