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

ZOl*_*ier 5 c++ linux cmake bulletphysics

我正在使用 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")
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以简单地运行一个脚本来删除它们,但这会严重破坏我目前的工作流程。

肯定有办法告诉 CMake 不要这样做吗?

我已经读过,NAMELINK_SKIP但如果我理解正确,那就是命令INSTALL,但我什至没有使用安装命令,而且我不打算在我的项目中使用,我目前仅在初始构建中获取符号链接。

sta*_*all 0

您所说的目标可能设置了VERSIONSOVERSION属性中的一个或两个。VERSION和目标属性状态的 CMake 文档SOVERSION(添加了重点):

对于共享库VERSION, 和SOVERSION可用于分别指定构建版本和 API 版本。构建或安装时,如果平台支持符号链接并且链接器支持 so-names ,则会创建适当的符号链接。如果仅指定两者之一,则假定缺少的版本号具有相同的版本号。

您可以做的是使用以下命令取消它们:

set_property(TARGET target_name_here PROPERTY VERSION)
set_property(TARGET target_name_here PROPERTY SOVERSION)
Run Code Online (Sandbox Code Playgroud)

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

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