CMake - 更改共享库链接选项
CMake - Changing shared library link options
我想在我的链接器蹦床python脚本中操作链接器调用,但是对于我的生活,我无法让CMake尊重CMAKE_CXX_CREATE_SHARED_LIBRARY
值。它始终使用CMAKE_CXX_COMPILER
进行链接。如果我切换到add_executable
并改用CMAKE_CXX_LINK_EXECUTABLE
,这将完美运行。有没有办法说服CMake尊重CMAKE_CXX_CREATE_SHARED_LIBRARY
的设置?
一个微不足道的CMakeList.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 )
在 CMake 版本 3.10 中按预期工作
我试过你的例子。您的意图没有问题。唯一的区别是,我用旧版本的CMake尝试了这个,并将变量声明直接放在文件CMakeList 中.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 项目网站上创建了一个问题,或者更确切地说是一个功能请求。
来自 Kitware 的响应
布拉德·金评论道:
CMAKE_CXX_LINK_EXECUTABLE
和CMAKE_CXX_CREATE_SHARED_LIBRARY
并不意味着直接由工具链文件设置(如果任何一个似乎有效,那只是偶然的(。它们也不是要缓存的。它们在 CMake 的平台/编译器信息模块中设置,这些模块在工具链文件之后加载。对于要交叉编译到自定义平台的工具链文件,它们可以将CMAKE_SYSTEM_NAME
设置为目标平台的名称,将CMAKE_MODULE_PATH
设置为自定义目录,然后为该平台添加具有此类设置Platform/<os>*.cmake
模块。
要连接到现有平台的链接行,需要另一种方法。 #18316 是相关的。
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- CMake - 更改共享库链接选项
- Eclipse CDT clang 工具链 - 无法从链接器选项中删除 stdlibc++,但可以添加 libc++,E
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- '-print_statistics'链接器选项在 Xcode 中产生错误
- C++ ld 链接器 --wrap 选项不适用于内部函数调用
- 提升程序选项:链接错误
- 如何从"开始组..结束组"链接器选项构建文件列表
- C++构建系统 - 远程编译和链接选项
- clang,linux是否有一个选项可以在链接时更改共享库名称
- 在源文件中定义链接选项C++
- 有-g和没有-DNDEBUG选项的链接时间很长
- 相同的C 代码,不同的链接选项会导致不同的行为
- AC_LANG_PROGRAM由于链接器选项的顺序失败了链接阶段
- 当我仅使用链接器选项 /LTCG时,为什么Visual Studio在Linker命令行中显示选项 /PGD
- 如何在CodeBlocks附加链接器选项中指定子系统
- Eclipse CDT链接选项-静态libgcc-静态libstdc++不影响Windows上的行为
- 用于链接的VC 11.0命令链接选项是什么
- Boost库构建-运行时链接和链接选项之间的差异
- 链接选项与g++