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
答案 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++