Подтвердить что ты не робот

В CMake, как я могу работать с каталогами Debug и Release, которые Visual Studio 2010 пытается добавить?

Я пытаюсь создать один из моих проектов на основе CMake из пары лет назад с Visual Studio 2010, и у меня возникают проблемы с выходным каталогом для проекта. Visual Studio всегда была очень заинтересована в добавлении подкатегорий Debug/и Release/при выводе двоичных файлов, и по разным причинам я всегда очень старался их удалить - теперь, когда я использую новую версию CMake и новую версию Visual Studio, старый обходной путь в CMake больше не работает, и я ищу, чтобы узнать "новый" способ сделать это.

В предыдущей версии CMake (2.6) и предыдущей версии Visual Studio (2008) я использовал следующее:

IF(MSVC_IDE)
    # A hack to get around the "Debug" and "Release" directories Visual Studio tries to add
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES PREFIX "../")
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES IMPORT_PREFIX "../")
ENDIF(MSVC_IDE)

Это сработало хорошо, но больше не похоже на трюк. Кто-нибудь знает о подобном, но более современном обходном пути, который будет работать с CMake 2.8.6 и Visual Studio 2010?

4b9b3361

Ответ 1

Это немного зависит от того, что именно вы хотите, но я бы порекомендовал взглянуть на доступные целевые свойства, похожие на этот вопрос.

Это зависит немного от того, что вы хотите именно. Для каждой цели вы можете вручную установить свойства library_output_directory или runtime_output_directory.

if ( MSVC )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory} )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG ${youroutputdirectory} )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE ${youroutputdirectory} )
    # etc for the other available configuration types (MinSizeRel, RelWithDebInfo)
endif ( MSVC )

Вы также можете сделать это глобально для всех подпроектов, используя что-то вроде этого:

# First for the generic no-config case (e.g. with mingw)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${youroutputdirectory} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${youroutputdirectory} )
# Second, for multi-config builds (e.g. msvc)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )

Ответ 2

В текущих версиях CMake вы можете использовать выражение генератора для LIBRARY_OUTPUT_DIRECTORY, чтобы избежать суффикса, зависящего от конфигурации.

Я просто добавил $<$<CONFIG:Debug>:>, который всегда расширяется до нуля, до моего. Это выглядит немного странно, но он работает, и это не так странно, что вы не можете объяснить это кратким комментарием:

# Use a generator expression so that the specified folder is used directly, without any
# configuration-dependent suffix.
#
# See https://cmake.org/cmake/help/v3.8/prop_tgt/LIBRARY_OUTPUT_DIRECTORY.html
set_target_properties(library PROPERTIES
                      LIBRARY_OUTPUT_DIRECTORY my/folder/$<$<CONFIG:Debug>:>)

Ответ 3

https://cmake.org/cmake/help/latest/prop_tgt/LIBRARY_OUTPUT_DIRECTORY.html объясняет, что:

Многоконфигурационные генераторы (VS, Xcode) добавляют подкаталог для конфигурации в указанный каталог, если не используется выражение генератора.

Таким образом, единственный обходной путь - использовать выражение генератора. Один из отличных способов сделать это - использовать $ <0:> в конце вашего пути. Так что, если ваш путь /what/ever/, вам нужно будет заменить его на /what/ever/$ <0:>.

Пример с целью: Нууа и путь: C: /Nuua/bin/

set_target_properties(nuua PROPERTIES RUNTIME_OUTPUT_DIRECTORY C:/Nuua/bin/$<0:>)