繁体   English   中英

CMake - 更改共享库链接选项

[英]CMake - Changing shared library link options

I want to manipulate the linker call in my linker trampoline python script, but for the life of me I cannot get CMake to respect the CMAKE_CXX_CREATE_SHARED_LIBRARY value. 它总是使用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 )

与 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的声明,因为我只将 object 文件传递给以下脚本。

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

#!/bin/bash

echo "$@"

Output:

$ 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的正式消息。 永远不会创建该库(使用我的 linker 命令)。

CMake版本:

$ cmake --version
cmake version 3.10.2

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

我看到您已经在CMake 项目站点上创建了一个问题或更确切地说是一个功能请求。

套件件的回应

布拉德金评论说:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM