【问题标题】:CMake - Changing shared library link optionsCMake - 更改共享库链接选项
【发布时间】:2020-06-18 14:13:27
【问题描述】:

我想在我的链接器蹦床 python 脚本中操作链接器调用,但在我的一生中,我无法让 CMake 尊重 CMAKE_CXX_CREATE_SHARED_LIBRARY 值。它总是使用CMAKE_CXX_COMPILER 进行链接。如果我切换到add_executable 并改用CMAKE_CXX_LINK_EXECUTABLE,则效果很好。有没有办法说服 CMake 尊重CMAKE_CXX_CREATE_SHARED_LIBRARY 的设置?

一个简单的 CMakeLists.txt

cmake_minimum_required( VERSION 3.12 )

project( mylib )

include( CMakePrintSystemInformation )

add_library( mylib SHARED mylib.cpp )

工具链摘录

我已经在工具链文件和 -C 预缓存选项中尝试过。

set( CMAKE_LINKER "/path/to/linker_trampoline.py" )
set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_LINKER> --CMAKE_CXX_COMPILER <CMAKE_CXX_COMPILER> --CMAKE_SHARED_LIBRARY_CXX_FLAGS <CMAKE_SHARED_LIBRARY_CXX_FLAGS> --LANGUAGE_COMPILE_FLAGS <LANGUAGE_COMPILE_FLAGS> --LINK_FLAGS <LINK_FLAGS> --CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> --SONAME_FLAG <SONAME_FLAG> --TARGET_SONAME <TARGET_SONAME> --TARGET <TARGET> --OBJECTS <OBJECTS> --LINK_LIBRARIES <LINK_LIBRARIES>" CACHE STRING "" FORCE )

【问题讨论】:

    标签: c++ c cmake


    【解决方案1】:

    使用 CMake 3.10 版按预期工作

    我已经尝试过您的示例。你的意图没有问题。唯一的区别是,我使用旧版本的 CMake 进行了尝试,并将变量声明直接放在文件 CMakeLists.txt 中(应该放在工具链文件中)。

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.10)
    
    project(mylib)
    
    include(CMakePrintSystemInformation)
    
    set (CMAKE_LINKER "/path/to/link.sh")
    set (CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_LINKER> <OBJECTS>")
    
    add_library(mylib SHARED mylib.cpp)
    

    我在这里缩短了CMAKE_CXX_CREATE_SHARED_LIBRARY 的声明,因为我只将目标文件传递给以下脚本。

    link.sh:(简单打印目标文件)

    #!/bin/bash
    
    echo "$@"
    

    输出:

    $ cmake CMakeLists.txt
    $ make
    [ 50%] Building CXX object CMakeFiles/mylib.dir/mylib.cpp.o
    [100%] Linking CXX shared library libmylib.so
    CMakeFiles/mylib.dir/mylib.cpp.o
    [100%] Built target mylib
    $
    

    link.sh 肯定会被执行。你忽略了关于链接 libmylib.so 的正式消息。永远不会创建库(使用我的链接器命令)。

    CMake 版本:

    $ cmake --version
    cmake version 3.10.2
    
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    $
    

    我看到您已经在CMake project site 上创建了一个问题,或者更确切地说是一个功能请求。

    【讨论】:

    • 也感谢您对此进行调查。这也是我发现的。 Brad King 说,我们不应该为此使用工具链 - 令人惊讶 - 所以我按照建议编写了一个模块。
    【解决方案2】:

    Kitware 的回应

    布拉德·金评论道:

    CMAKE_CXX_LINK_EXECUTABLECMAKE_CXX_CREATE_SHARED_LIBRARY 并不意味着直接由工具链文件设置(如果其中任何一个似乎工作,那只是偶然)。它们也不打算被缓存。它们设置在 CMake 的平台/编译器信息模块中,这些模块在工具链文件之后加载。对于要交叉编译到自定义平台的工具链文件,他们可以将CMAKE_SYSTEM_NAME 设置为目标平台的名称,将CMAKE_MODULE_PATH 设置为自定义目录,然后为该平台添加具有此类设置的Platform/&lt;os&gt;*.cmake 模块。

    要连接到现有平台的链接线,需要另一种方法。 #18316 相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多