2015-04-01 3 views
0

TL; DR: текстовое приложение C++ 11/Boost/Openssl, построенное на OS X 10.8. Должен ли такой же скомпилированный двоичный файл работать без изменений 10.9 и 10.10? Или я должен скомпилировать его для каждой версии?Может ли текстовое приложение на C++, составленное на OS X 10.8, работать с 10.9 и 10.10?


Деталь:

C++ 11 приложений и статическая библиотека, которая использует OpenSSL, а также повышение :: регулярного выражения, повышение :: ASIO, и повышение :: системы. Я использую cmake (поскольку это порт из Linux + Windows), и все строит и работает отлично на 10.8.2 [Mountain Lion].

Но когда приложение установлено на новее OS X, таких как 10.9, мы видим эту ошибку:

dyld: Symbol not found: __ZTISt16invalid_argument 
Referenced from: /usr/bin/myapp 
Expected in: /usr/local/lib/libboost_regex-mt.dylib 
in /usr/bin/myapp 
Trace/BPT trap: 5 

libboost_regex-mt.dylib не нашли __ZTISt16invalid_argument. Я предполагаю, что std::invalid_argument должен быть в libC++, поэтому что-то пошло не так. (Является ли эта часть libstdC++ против LibC++ проблема, которую я слышал о?)

Это, как я считаю, мои библиотечных зависимостей в CMake:

SET (Boost_DEBUG 0) 
SET (Boost_USE_STATIC_LIBS OFF) 
SET (Boost_USE_MULTITHREADED ON) 
SET (Boost_USE_STATIC_RUNTIME OFF) # also tried "ON" 
FIND_PACKAGE (Boost REQUIRED COMPONENTS regex system date_time) 
FIND_PACKAGE (OpenSSL REQUIRED) 
FIND_PACKAGE (Threads REQUIRED) 

Эти флаги я предлагаю построить:

SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic -std=c++11 -stdlib=libc++ -DMAC_OS_X_VERSION_MIN_REQUIRED=1000") 

Когда я первый запустить cmake он показывает следующее:

-- The C compiler identification is AppleClang 5.1.0.5030040 
-- The CXX compiler identification is AppleClang 5.1.0.5030040 
... 
-- Check for working CXX compiler:  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info - done 
-- Detecting CXX compile features - done 
+0

кажется ошибку компоновщика, то, что вы должны заботиться с '' link_directories' и командами target_link_libraries' (см CMake документации) – Antonio

ответ

0

С Вы хотите компилировать для OS X 10.7+ следует изменить:

DMAC_OS_X_VERSION_MIN_REQUIRED=1000 

к этому:

DMAC_OS_X_VERSION_MIN_REQUIRED=1070 

В противном случае вы будете пытаться компилировать/построить для версий OS X (v10.0 +), которые слишком древние, чтобы иметь возможность обрабатывать ваш более современный код.

Второе беспокойство, так как вы уже догадались это libstdc++ против libc++, что изменилось в OS X 10.9+ - (10.9+ uses libc++). Исходя из этого, выбранный вами компилятор кажется правильным для 10.9, однако ошибка, скорее всего, является индикатором того, что вам нужно использовать libstdc++, который по умолчанию использовался бы на вашей рабочей версии 10.8.

Попробуйте изменить:

-stdlib=libc++ 

к:

-stdlib=libstdc++ 
+0

Спасибо для подсказки MIN_REQUIRED. Я не знал, как это работает. Когда я перехожу к -stdlib = libstdC++, компиляция немедленно завершается неудачей с «неустранимым файлом хронологической ошибки». Исходная строка, с которой он выходит, - это: #include . Есть ли уловка для использования C++ 11 с libstdC++? –

+0

Несомненно.Похоже, что либо компилятор не находит включения с этой ошибкой, либо 'libstdC++' не использует 'chrono'. Обычно CMake неплохо разбирается в правильной настройке компиляции; возможно, попробуйте удалить 'std' и' stdlib' и обновить make-файл, чтобы увидеть, что это такое. Когда вы скомпилировали для '10.8', какую версию OS X вы ее скомпилировали, и вы использовали CMake? –