2015-05-30 3 views
8

Я пытаюсь установить несколько определений компиляции для одного из исполняемых файлов, которые я пытаюсь скомпилировать в CMake (чтобы активировать макросы, используемые для отладки). Вот что я пробовал:CMake - как установить несколько определений компиляции для исполняемого файла цели?

add_executable (trie_io_test trie_io_test.c trie.c word_list.c) 
    set_target_properties(
      trie_io_test 
      PROPERTIES 
      COMPILE_DEFINITIONS UNIT_TESTING=1) 
    set_target_properties(
      trie_io_test 
      PROPERTIES 
      COMPILE_DEFINITIONS IO_TEST=1) 

К сожалению, это приводит к определению только IO_TEST.

Я также попытался следующие:

add_executable (trie_io_test trie_io_test.c trie.c word_list.c) 
    set_target_properties(
      trie_io_test 
      PROPERTIES 
      COMPILE_DEFINITIONS UNIT_TESTING=1 IO_TEST=1) 

Но, с другой стороны, вызывает ошибку CMake.

Как установить оба этих определения для исполняемого файла, который я пытаюсь создать?

ответ

20

Вы хотите target_compile_definitions вместо set_target_properties:

target_compile_definitions(trie_io_test PRIVATE UNIT_TESTING=1 IO_TEST=1) 
+8

Я связан с Docs в моем ответе, но это действительно полезно только для библиотек, а не бывшими. Libs может определять свои флагов компиляции как «ЧАСТНЫЕ», «PUBLIC» или «INTERFACE». 'PRIVATE' в основном означает, что флаги применяются только к этой библиотеке. Флаги «PUBLIC» и «INTERFACE» также применяются к любой цели, которая привязана к ней (т. Е. Ее зависимым); разница между этими двумя заключается в том, что флаги 'INTERFACE' не применяются к самой библиотеке - только ее зависимым. – Fraser

+0

Спасибо, для справки, это ответ на мой вопрос «Что означает PRIVATE в данном случае?» который я удалил, потому что увидел, что после запроса вопроса появилась ссылка на документацию. – qiubit

+2

PRIVATE добавляет свойство именно этой цели. INTERFACE добавляет свойство к объектам, которые ссылаются на эту цель. PUBLIC действует как PRIVATE и INTERFACE, потому что он добавляет свойство как к этой цели, так и к целевым объектам, которые ссылаются на эту цель. – Jay