2014-11-18 3 views
5

Я пытаюсь получить местоположение статической библиотеки другого проекта. Я попытался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) и подумал, что если я хотел бы получить, что заявление на работу я мог бы решить мою реальную проблему. Так вот, что я задал выше, вопрос. Я не понимал, что это приведет к путанице для людей, которые пытаются мне ответить.

+1

Сообщение не может принять генераторных выражений. Поскольку они генерируются для каждой конфигурации сборки, они ведут себя очень странно по сравнению с обычными переменными. Итак, вопрос в том, где вы пытаетесь использовать целевое местоположение? – IdeaHat

+0

Я хочу, чтобы создать флаг компоновщика, чтобы связать статическую библиотеку А в другой статической библиотеки B следующим образом: set_target_properties (B СВОЙСТВА STATIC_LIBRARY_FLAGS $ <целевой_файл: A>) это не работает. Это приводит к тому, что $ генерируется в файл проекта вместо его результата. Использование message() было средством для отладки проблемы. Я думаю, когда я получаю его для работы с message(), он должен работать с set_target_properties(). – Dirk

ответ

2

Если вы хотите использовать библиотеку в другой вы должны использовать target_link_libraries функцию:

target_link_libraries(B A) 

Подпись target_link_libraries автоматически распространяется A во все без статических библиотек и исполняемых файлов, которые используют B (как непосредственно, так и косвенно).

Статические библиотеки, которые используют B, знают об их зависимости от A, но у них не будет копии файлов объектов с A внутри них. Информация о зависимостях передается в INTERFACE_LINK_LIBRARIES и LINK_LIBRARIES целевых свойствах библиотек.

По своей конструкции статическая библиотека - это просто архив объектных файлов. Не нужно смешивать объектные файлы из разных библиотек вместе вручную, если вы хотите использовать библиотеки в вашем проекте CMake. CMake проинструктирует ваш компоновщик со списком библиотек, которые необходимо связать и надлежащим образом упорядочить библиотеки (которые действительно создаются из графика зависимостей). Компилятор, в свою очередь, разрешит все символы из объектных файлов, которые переносятся в поставленных статических библиотеках.

Если вам все еще нужно иметь точный контроль смешивания объектов файлов, вы можете рассмотреть возможность использования OBJECT library type:

# Create plain objects library which essentially is a set of object files 
add_library(zipobj OBJECT zip.cpp) 
# Archive all objects from zipobj. Recompilation of zip.cpp won't take place. 
add_library(zip STATIC $<TARGET_OBJECTS:zipobj>) 

add_library(lzmaobj OBJECT lzma.zpp) 
add_library(lzma STATIC $<TARGET_OBJECTS:lzmaobj>) 

# Create a library which contains object files from both zipobj and lzmaobj 
add_library(archive STATIC $<TARGET_OBJECTS:zipobj> $<TARGET_OBJECTS:lzmaobj>) 

EDIT: Также вы можете попробовать функцию merge_libraries: http://www.mail-archive.com/[email protected]/msg28670.html

+0

Спасибо за ваш ответ roolebo, но afaik, который означает только «cmake», если кто-то ссылается на B, автоматически связывает A также ». Я хочу, чтобы A был включен в B для реального, так что, если я возьму библиотеку и использую ее где-то еще, все будет включено в нее. – Dirk

+0

@ Дирк, я уточнил ответ. Вероятно, тип библиотеки OBJECT - это то, что вы ищете. – roolebo

+0

Еще раз спасибо за ваш ответ. Кажется, я недостаточно четко заявлял о своих намерениях. Я уточнил свой вопрос выше. Я просто хочу, чтобы один CMake создавал статическую библиотеку, которая включает в себя все символы, не испортив мою библиотечную структуру. – Dirk

Смежные вопросы