CMake - изменение параметров ссылки на общую библиотеку - PullRequest
1 голос
/ 18 июня 2020

Я хочу управлять вызовом компоновщика в моем сценарии 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 )

Ответы [ 2 ]

1 голос
/ 29 июня 2020

Работает, как ожидалось, с 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, потому что я передаю объектные файлы только в следующий скрипт .

ссылка. 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
$

ссылка. sh обязательно будет выполнена. Вы игнорируете формальное сообщение о связывании libmylib.so . Библиотека никогда не будет создана (с моей командой компоновщика).

Версия CMake:

$ cmake --version
cmake version 3.10.2

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

Я видел, что вы уже создали проблему или, скорее, функцию запрос на сайт проекта CMake .

0 голосов
/ 01 июля 2020

Ответ от Kitware

Брэд Кинг прокомментировал:

CMAKE_CXX_LINK_EXECUTABLE и CMAKE_CXX_CREATE_SHARED_LIBRARY не предназначены для непосредственной установки с помощью файлов инструментальной цепочки (и если какой-либо из них работает, то только несчастный случай). Они также не предназначены для кеширования. Они устанавливаются в информационных модулях платформы / компилятора CMake, которые загружаются после файла инструментальной цепочки. Для файлов инструментальной цепочки, предназначенных для кросс-компиляции на пользовательскую платформу, они могут установить CMAKE_SYSTEM_NAME в качестве имени целевой платформы, установить CMAKE_MODULE_PATH в пользовательский каталог, а затем добавить Platform/<os>*.cmake модули с такими настройками для этой платформы.

Чтобы подключиться к линии связи для существующей платформы, потребуется другой подход. # 18316 связано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...