您的位置:首页 > 移动开发 > IOS开发

编译iOS版本的tbb库

2012-08-23 16:33 363 查看
官方TBB库并不支持ios

考虑到opencv 2.4.2支持生成android的tbb库,这说明一定也可以将tbb库移植到ios中

在opencv 2.4.2中,生成android的tbb库的使用的是opencv/3rdparty/tbb/CMakeLists.txt,因此只需修改此文件,然后再参考脚本/Users/koupoo/workspace/TBB/opencv/ios/configure-device_xcode.sh(这个脚本用于生成iOS 版本的opencv)就可以生成tbb库的xcode项目

修改后的opencv/3rdparty/tbb/CMakeLists.txt:

#build TBB for Android from source

#if(NOT ANDROID)

# message(FATAL_ERROR "The script is designed for Android only!")

#endif()

project(tbb)

# 4.0 update 4 - works fine

set(tbb_ver "tbb40_20120408oss")

set(tbb_url "http://threadingbuildingblocks.org/uploads/77/185/4.0%20update%204/tbb40_20120408oss_src.tgz")

set(tbb_md5 "734b356da7fe0ed308741f3e6018251e")

set(tbb_version_file "version_string.ver")

# 4.0 update 3 - build broken

#set(tbb_ver "tbb40_20120201oss")

#set(tbb_url "http://threadingbuildingblocks.org/uploads/77/182/4.0%20update%203/tbb40_20120201oss_src.tgz")

#set(tbb_md5 "4669e7d4adee018de7a7b8b972987218")

#set(tbb_version_file "version_string.tmp")

# 4.0 update 2 - works fine

#set(tbb_ver "tbb40_20111130oss")

#set(tbb_url "http://threadingbuildingblocks.org/uploads/77/180/4.0%20update%202/tbb40_20111130oss_src.tgz")

#set(tbb_md5 "1e6926b21e865e79772119cd44fc3ad8")

#set(tbb_version_file "version_string.tmp")

#set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)

# 4.0 update 1 - works fine

#set(tbb_ver "tbb40_20111003oss")

#set(tbb_url "http://threadingbuildingblocks.org/uploads/77/177/4.0%20update%201/tbb40_20111003oss_src.tgz")

#set(tbb_md5 "7b5d94eb35a563b29ef402e0fd8f15c9")

#set(tbb_version_file "version_string.tmp")

#set(tbb_need_GENERIC_DWORD_LOAD_STORE TRUE)

set(tbb_tarball "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_ver}_src.tgz")

set(tbb_src_dir "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")

macro(getMD5 filename varname)

if(CMAKE_VERSION VERSION_GREATER 2.8.6)

file(MD5 "${filename}" ${varname})

else()

execute_process(COMMAND ${CMAKE_COMMAND} -E md5sum "${filename}"

RESULT_VARIABLE getMD5_RESULT

OUTPUT_VARIABLE getMD5_OUTPUT

OUTPUT_STRIP_TRAILING_WHITESPACE)

if(getMD5_RESULT EQUAL 0)

string(REGEX MATCH "^[a-z0-9]+" ${varname} "${getMD5_OUTPUT}")

else()

set(${varname} "invalid_md5")

endif()

endif()

endmacro()

if(EXISTS "${tbb_tarball}")

getMD5("${tbb_tarball}" tbb_local_md5)

if(NOT tbb_local_md5 STREQUAL tbb_md5)

message(WARNING "Local copy of TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")

file(REMOVE "${tbb_tarball}")

if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")

file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/${tbb_ver}")

endif()

endif()

endif()

if(NOT EXISTS "${tbb_tarball}")

message(STATUS "Downloading ${tbb_ver}_src.tgz")

file(DOWNLOAD "${tbb_url}" "${tbb_tarball}" TIMEOUT 600 STATUS __statvar)

if(NOT __statvar EQUAL 0)

message(FATAL_ERROR "Failed to download TBB sources: ${tbb_url}")

endif()

getMD5("${tbb_tarball}" tbb_local_md5)

if(NOT tbb_local_md5 STREQUAL tbb_md5)

file(REMOVE "${tbb_tarball}")

message(FATAL_ERROR "Downloaded TBB source tarball has invalid MD5 hash: ${tbb_local_md5} (expected: ${tbb_md5})")

endif()

if(EXISTS "${tbb_src_dir}")

file(REMOVE_RECURSE "${tbb_src_dir}")

endif()

endif()

# untar TBB sources

if(NOT EXISTS "${tbb_src_dir}")

message(STATUS "Unpacking ${tbb_ver}_src.tgz to ${tbb_src_dir}")

execute_process(COMMAND ${CMAKE_COMMAND} -E tar xz "${tbb_tarball}"

WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"

RESULT_VARIABLE tbb_untar_RESULT)

if(NOT tbb_untar_RESULT EQUAL 0 OR NOT EXISTS "${tbb_src_dir}")

message(FATAL_ERROR "Failed to unpack TBB sources")

endif()

endif()

#set(TBB_INCLUDE_DIRS "${tbb_src_dir}/include" PARENT_SCOPE)

#ocv_include_directories("${tbb_src_dir}/include"

# "${tbb_src_dir}/src/"

# "${tbb_src_dir}/src/rml/include"

# "${CMAKE_CURRENT_SOURCE_DIR}")

file(GLOB lib_srcs "${tbb_src_dir}/src/tbb/*.cpp")

file(GLOB lib_hdrs "${tbb_src_dir}/src/tbb/*.h")

list(APPEND lib_srcs "${tbb_src_dir}/src/rml/client/rml_tbb.cpp")

add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0 #required

-D__TBB_BUILD=1 #required

-D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk on Android ?

-DUSE_PTHREAD #required

-DTBB_USE_GCC_BUILTINS=1 #required

-DTBB_USE_DEBUG=0 #just to be sure

-DTBB_NO_LEGACY=1 #don't need backward compatibility

-DDO_ITT_NOTIFY=0 #it seems that we don't need these notifications

)

if(tbb_need_GENERIC_DWORD_LOAD_STORE)

#needed by TBB 4.0 update 1,2; fixed in TBB 4.0 update 3 but it has 2 new problems

add_definitions(-D__TBB_USE_GENERIC_DWORD_LOAD_STORE=1)

set(tbb_need_GENERIC_DWORD_LOAD_STORE ON PARENT_SCOPE)

endif()

add_library(tbb STATIC ${lib_srcs} ${lib_hdrs} "${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h" "${CMAKE_CURRENT_SOURCE_DIR}/${tbb_version_file}")

target_link_libraries(tbb c m dl)

#ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations)

string(REPLACE "-Werror=non-virtual-dtor" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include \"${CMAKE_CURRENT_SOURCE_DIR}/android_additional.h\"")

#set_target_properties(tbb

# PROPERTIES OUTPUT_NAME tbb

# DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}"

# ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}

# )

if(ENABLE_SOLUTION_FOLDERS)

set_target_properties(tbb PROPERTIES FOLDER "3rdparty")

endif()

#if(NOT BUILD_SHARED_LIBS)

# install(TARGETS tbb ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main)

#endif()

# get TBB version

#ocv_parse_header("${tbb_src_dir}/include/tbb/tbb_stddef.h" TBB_VERSION_LINES TBB_VERSION_MAJOR TBB_VERSION_MINOR TBB_INTERFACE_VERSION CACHE)

然后参考/Users/koupoo/workspace/TBB/opencv/ios/configure-device_xcode.sh脚本生成tbb的xcode项目:

cd /Users/koupoo/workspace/TBB/tbb_build

cmake -GXcode -DCMAKE_TOOLCHAIN_FILE=../opencv/ios/cmake/Toolchains/Toolchain-iPhoneOS_Xcode.cmake -DCMAKE_INSTALL_PREFIX=../OpenCV_iPhoneOS ../opencv/3rdparty/tbb/

最后会在目录/Users/koupoo/workspace/TBB/tbb_build中的到tbb的Xcode项目

打开tbb的Xcode,然后酌情解决头文件找不到的问题和其他问题,在实际编译过程中,这些问题都好解决。

最终生成了IOS用的TBB库,接下来就要看这个TBB库好不好用了。

注:在编译过程中 唯一的不足之处是 修改了include/tbb/tbb_machine.h这个文件:



#if ( __TBB_USE_GENERIC_PART_WORD_CAS)

#error generic implementation of part-word CAS was explicitly disabled for this configuration

#endif

改为了

#if ( __TBB_USE_GENERIC_PART_WORD_CAS)

//#error generic implementation of part-word CAS was explicitly disabled for this configuration

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: