2016-05-20 2 views
0

Давайте рассмотрим два упрощенных CMakeLists.txtCmake. Аномальное поведение

set(GTEST "/usr/local/lib/libgtest.a") 
set(GMOCK "/usr/local/lib/libgmock.a") 
... 
target_link_libraries(project ${GTEST} ${GMOCK}) 

И когда я cmake, а затем make это работает. Однако, следующее не работает:

set(GTEST "/usr/local/lib/libgtest.a /usr/local/lib/libgmock.a") 
... 
target_link_libraries(project ${GTEST}) 

Когда я поставил cmake он хорошо работает. Но когда я ставлю это сделать, это дает мне:

make[3]: *** There is no rule for '/usr/local/lib/libgtest.a /usr/local/lib/libgmock.a' 

Почему?

+2

Похоже, у вас есть дополнительная двойная кавычка во втором примере. – sebenalern

+0

Я отредактировал. Я не был проблемой. Я только что ошибся, когда у меня был пост. –

+1

Вы должны копировать/вставлять стенограмму при составлении сообщения. Как мы узнаем, что вы не допустили других подобных ошибок транскрипции? –

ответ

2

Эти два примера не означают одно и то же. Первый пример передает две библиотеки в target_link_libraries. Второй - одно имя библиотеки с двумя пробелами в нем. Если вы хотите передать две библиотеки в одной переменной, используйте

set(GTEST "/usr/local/lib/libgtest.a" "/usr/local/lib/libgmock.a") 

Что касается причин неудачи такое странное сообщение, я подозреваю, отсутствует побег на части CMake (хотя ваш путь будет иметь имя каталога с завершающим пробелом в нем, что, вероятно, не произойдет на практике).

+0

ok, поэтому: 'set' делает переменную, которая является строкой в ​​нашем случае. Я понимаю, что 'target_link_libraries' предполагает, что в переданной переменной будет ровно одна библиотека (путь к одной библиотеке) !? –

+1

Как указано в моем ответе, вы можете передать несколько значений (то есть список значений) в одной переменной в 'target_link_libraries'. Но цитируемое пространство не интерпретируется как разделитель в CMake (фактически, точка с запятой ';' is: 'set (foo" bar "" baz ")' такая же, как 'set (foo" bar; baz ")'). – Oberon

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