Различные флаги компиляции для одного и того же файла в разных целях

Я хотел бы включить файл .cpp в две разные цели (превратившись в два проекта VS после запуска CMake). Я хотел бы установить разные COMPILE_FLAGS для этих проектов.

Однако, когда я делаю

SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags1")
ADD_EXECUTABLE(project1 myfile.cpp)
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags2")
ADD_EXECUTABLE(project2 myfile.cpp)

, «flags2» применяется к обоим проектам, поэтому кажется, что свойства перезаписываются в строке 3 и не учитываются в строке 2. Является это правда или я что-то упускаю? Есть ли способ решить эту проблему?

Спасибо!

18
задан Philipp 12 July 2011 в 14:32
поделиться

3 ответа

Я решил эту проблему с помощью 2 флагов, один для исходного файла, один для цели.

macro(enable_on_source target src)
    set_source_files_properties(${src}
                                PROPERTIES COMPILE_OPTIONS "-OptionModule")
    set_target_properties(${target}
                          PROPERTIES COMPILE_OPTIONS "-OptionTarget")
endmacro()

и во время компиляции я делаю вещи, только если установлены обе опции.

Это абсолютно независимое от объемов каталога и что нет.

0
ответ дан 30 November 2019 в 08:42
поделиться

Если вы придерживаетесь одной цели для каждой подкаталоги, вы можете сделать следующее, используя add_definitions, чтобы добавить свои флаги компиляции.


# in ./CMakeLists.txt
add_subdirectory(project1)
add_subdirectory(project2)   

# in ./project1/CMakeLists.txt:
add_definitions("flags1")
add_executable(project1 ../myfile.cpp)

# in ./project2/CMakeLists.txt:
add_definitions("flags2")
add_executable(project2 ../myfile.cpp)

add_definitions применяется ко всем файлам, скомпилированным в этом подкаталоге, и к тем, которые находятся в нем. Вы можете применить флаги к определенным файлам, используя следующее:

set_source_files_properties(myfile.cpp PROPERTIES COMPILE_FLAGS "flags")
5
ответ дан 30 November 2019 в 08:42
поделиться

Я решаю эту проблему следующим образом. В CMakeLists.txt:

set_target_properties (test1 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=1")
set_target_properties (test2 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=9")

set_source_files_properties (source1.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=7")
set_source_files_properties (source2.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=4")

В некоторых файлах заголовков:

  #if TARGET_ID==1 && FILE_ID==7
    #define SPECIAL_VALUE 17
  #elif TARGET_ID==1 && FILE_ID==4
    #define SPECIAL_VALUE 14
  #elif TARGET_ID==9 && FILE_ID==7
    #define SPECIAL_VALUE 97
  #elif TARGET_ID==9 && FILE_ID==4
    #define SPECIAL_VALUE 94
  #endif

Далее, включите вышеупомянутый заголовок в source1.cpp и source2.cpp и компиляция Я думаю, что CMake не имеет более приемлемого решения

0
ответ дан 30 November 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: