2016-11-06 4 views
2

Мой проект cmake должен скомпилировать код C++ 14. Он также использует CMakeLists.txts, включенные в его внешние библиотеки (которые являются подмодулями git в моем проекте). Сбой сборки на macOS Sierra (cmake 3.6.2), потому что the default STL of clang is old and doesn't handle c++11. Насколько я понимаю, есть два STL, поставляемых с clang: libstdC++ (из gcc) (по умолчанию) или libC++. Так что, если я добавить опцию -stdlib=libc++ в CMake, источник компилирует:Пусть cmake с использованием clang C++ 11 (C++ 14)

add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-std=c++14>") 
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-stdlib=libc++>") 

Но тогда он не во время компоновки, потому что он пытается использовать libstdC++ для связывания. Как указать в cmake, что новый STL libC++ должен использоваться для всего процесса сборки?

PS: Что такое обоснование clang с использованием gcc STL по умолчанию, если оно слишком старое? Могу ли я навсегда указать, какой STL он должен использовать? Или я делаю что-то совершенно неправильное (могут ли некоторые из моих подпроектов молча заставить gcc?)?

+0

Обновление: Моя проблема с неправильным stdlib (и вопросами выше) была вызвана линией 'set (CMAKE_OSX_DEPLOYMENT_TARGET 10.7)' в одном из моих sub-CMakeLists.txt; см. комментарий ниже! – telephone

ответ

7

Вы должны полагаться на CMake обрабатывать опции компиляции. Просто укажите хотел стандартную версию:

set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 

target_compile_features также может быть использован для требуют особенности стандарта (и неявно попросить CMake установить адекватную конфигурацию). Дополнительная информация here.

+0

Это не работает для меня. У меня Ogre3D как подмодуль. Давайте рассмотрим только его автономность. Конфигурация cmake идет хорошо, но компиляция (через make) терпит неудачу. Рассмотрим его CMakeLists.txt: https://bitbucket.org/sinbad/ogre/src/108ab0bcc69603dba32c0ffd4bbbc39051f421c9/CMakeLists.txt?at=v1-9. Если я удалю строки 35-43 и добавлю ваш код наверху, компиляция завершится неудачей (неизвестные шаблоны STL из C++ 14). Сохранение CMakeLists.txt как есть, компиляция идет хорошо (C++ 11). – telephone

+0

После многократного поиска (смотря на вызовы компилятора с 'make VERBOSE = 1' для cmake), это был флаг' mmacosx-version-min = 10.7', который вызывал ошибку компиляции [путем присвоения ей неправильных заголовков] (http://stackoverflow.com/a/2927217/753850). Оказалось, что проблема _CMakeLists.txt_ от Ogre3D была проблемой: у нее была строка 'set (CMAKE_OSX_DEPLOYMENT_TARGET 10.7)'. Это фактически полностью решает мой вопрос! – telephone

1

Я полагаю, вы также должны передать эту Flang линкера в случае лязг:

link_libraries("-stdlib=libc++") 
+0

Спасибо! Сначала я попытаюсь выполнить работу 'CMAKE_CXX_STANDARD' (как в приведенном выше ответе), но ваш ответ - это то, что я искал в первую очередь (хотя еще не пробовал). – telephone