Я пытаюсь получить местоположение статической библиотеки другого проекта. Я попыталсяCMAKE Как получить местоположение целевого файла
get_property (target_name TARGET Test Местонахождение объекта), но CMake дает следующее сообщение об ошибке
CMake Error at project.cmake:6 (get_property):
The LOCATION property may not be read from target "A".
Use the target name directly with add_custom_command, or use the generator
expression $<TARGET_FILE>, as appropriate.
Я пытался использовать выражение генератора, указанное в сообщении об ошибке без успеха.
MESSAGE($<TARGET_FILE:A>)
просто выводит ту же самую строку, так что выражение генератор, кажется, не быть оценены на всех:
$<TARGET_FILE:A>
Я прочитал Documentation. В первых строках он упоминает:
Генератора выражение вычисляется в процессе генерации системы сборки для получения информации, специфической для каждой конфигурации сборки.
Если я правильно понимаю это, то во время оценки функции сообщения выражения генератора больше не оцениваются? Так что я должен делать в этом случае?
я совершил минимальный пример этой проблемы на GitHub
EDIT:
Я сожалею, что задал этот вопрос таким окольным путем без ясного объяснения моих намерений:
Моя цель - получить CMake для создания одиночной (!) Статической библиотеки для моего проекта, который может использовать кто-то другой (кто не использует CMake). Я бы по-прежнему использовал «нормальное» разрешение зависимостей для моего проекта, но другой человек, который не использует CMake, должен был вручную связать несколько библиотек с его проектом, что несколько неудобно. Решить эту проблему будет одна библиотека.
На моем пути пытаться заставить CMake статически связывать две статические библиотеки, я где-то читал (извините, я не сохранил ссылку), что, по крайней мере, при использовании Visual Studio в качестве компилятора вы можете получить результат, который я хочу если я прилагаю полный путь статической библиотеки должны быть связаны со статическими флагов компоновщика как то:
set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS >>>INSERT_PATH_HERE<<<)
, который делает фактически работают. Но теперь я должен вставить Мануалы полный путь к переменной там
set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS "/path/to/library.lib")
, который, кажется, не быть «хорошим» способ сделать это для меня. Таким образом, я экспериментировал с выражениями генератора и придумал следующему:
set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS $<TARGET_FILE:A>)
, который не работает по причинам, не в полной мере понять. Я думаю, что set_target_properties просто не поддерживает выражения генератора.При попытке получить мой проект для работы я попытался
MESSAGE($<TARGET_FILE:A>)
(как указано выше этой explenation) и подумал, что если я хотел бы получить, что заявление на работу я мог бы решить мою реальную проблему. Так вот, что я задал выше, вопрос. Я не понимал, что это приведет к путанице для людей, которые пытаются мне ответить.
Сообщение не может принять генераторных выражений. Поскольку они генерируются для каждой конфигурации сборки, они ведут себя очень странно по сравнению с обычными переменными. Итак, вопрос в том, где вы пытаетесь использовать целевое местоположение? – IdeaHat
Я хочу, чтобы создать флаг компоновщика, чтобы связать статическую библиотеку А в другой статической библиотеки B следующим образом: set_target_properties (B СВОЙСТВА STATIC_LIBRARY_FLAGS $ <целевой_файл: A>) это не работает. Это приводит к тому, что $ генерируется в файл проекта вместо его результата. Использование message() было средством для отладки проблемы. Я думаю, когда я получаю его для работы с message(), он должен работать с set_target_properties(). –
Dirk