在OS X 10.8上编译的C ++文本应用程序是否可以在10.9和10.10上运行?

时间:2015-04-01 07:50:52

标签: macos c++11 boost cmake dylib

TL; DR :基于OS X 10.8构建的基于文本的C ++ 11 / Boost / Openssl应用程序。那个相同的编译二进制文件在10.9和10.10上是否也能保持不变?或者我必须为每个版本编译它吗?


详情

C ++ 11应用程序和静态库,它使用openssl,boost :: regex,boost :: asio和boost :: system。我正在使用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

1 个答案:

答案 0 :(得分: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++