如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?

How can I prevent CMake from creating a symlink for shared libraries on build (not on install)?

本文关键字:共享 创建 符号链接 安装 CMake 何防止 构建      更新时间:2023-10-16

我正在使用CMake在Linux上使用Bullet3构建一个项目,在构建整个解决方案时,它会构建附加SOVERSION的Bullet输出库,并创建一个没有版本的符号链接。

对于我的特定方案,我不喜欢这种行为,并且我不想编辑项目符号子模块的 CMakeLists 文件。

这是我的CMake,我在其中包含子弹库:

set(USE_DOUBLE_PRECISION ON CACHE BOOL "" FORCE)
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)

set(BUILD_BULLET3 OFF CACHE BOOL "" FORCE)
set(BUILD_EGL OFF CACHE BOOL "" FORCE)
set(BUILD_ENET OFF CACHE BOOL "" FORCE)
set(BUILD_PYBULLET OFF CACHE BOOL "" FORCE)
set(BUILD_OPENGL3_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)

set(INSTALL_LIBS OFF CACHE BOOL "" FORCE)
set(USE_MSVC_RUNTIME_LIBRARY_DLL OFF CACHE BOOL "" FORCE)
set(USE_GRAPHICAL_BENCHMARK OFF CACHE BOOL "" FORCE)
set(USE_SOFT_BODY_MULTI_BODY_DYNAMICS_WORLD OFF CACHE BOOL "" FORCE)
set(BUILD_CPU_DEMOS OFF CACHE BOOL "" FORCE)
set(USE_GLUT OFF CACHE BOOL "" FORCE)
SET(INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES OFF CACHE BOOL "" FORCE)
SET(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES OFF CACHE BOOL "" FORCE)
add_subdirectory("${PROJECT_SOURCE_DIR}/src/bullet3")

我希望生成的项目符号库在构建目录中的每个库只有一个文件,而不是两个,无论它是否附加了版本都没关系......我只是不想要那里的符号链接。

我知道我可以简单地运行一个脚本来删除这些,但这会大大破坏我的工作流程。

肯定有办法告诉CMake不要那样做吧?

我已经阅读了有关NAMELINK_SKIP的信息,但是如果我理解正确,这是针对INSTALL命令的,但我什至没有使用安装命令,也不打算在我的项目中使用,我目前正在通过初始构建获取符号链接。

您所说的目标可能设置了VERSIONSOVERSION属性之一或两者。VERSIONSOVERSION目标属性状态的 CMake 文档(强调已添加(:

对于共享库,VERSIONSOVERSION分别用于指定构建版本和 API 版本。在构建或安装适当的符号链接时,如果平台支持符号链接并且链接器支持名称,则会创建相应的符号链接。如果只指定了两者中的一个,则假定缺少的版本号相同。

您可以做的是使用以下方法取消设置它们:

set_property(TARGET target_name_here PROPERTY VERSION)
set_property(TARGET target_name_here PROPERTY SOVERSION)

上面的代码将在add_subdirectory("${PROJECT_SOURCE_DIR}/src/bullet3")之后

这也意味着安装没有符号链接。如果您仍然想为安装提供符号链接,我不知道您会怎么做。