4

OSX 10.9 で XCode 5.0.1 を使用しており、libc++ (LLVM C++ 標準ライブラリ) と有効なアーキテクチャ armv7 をリンクしています。armv7s とその両方。

1º Cmake を使用して OpenCV2.framework + foo を使用するプロジェクトを作成し、 foo.a を使用して XCode プロジェクトを作成します。私の実行可能ファイルは OpenCV2.framework + foo.a をリンクし、完全に動作し、コンパイルしてリンクします。

2º Ogre のテンプレートを使用して別のプロジェクトを作成しました。このプロジェクトは完璧に機能します。

3º 次に、新しいプロジェクトに foo.a を追加して、ステップ 1 で使用した実行可能ファイルと同じものを作成します。

  • ヘッダー検索パスへのインクルード パスの追加。
  • ライブラリ検索パスにライブラリ パスを追加します。
  • -ObjC -all_load -lfoo をThisおよびthisとして他のリンカー パスに追加する
  • プロジェクトに必要なコード ソースを追加します。
  • foo 関数の呼び出しを使用している場合 --> リンクの問題: アーキテクチャ armv7 の未定義シンボルが foo::functionname() に。

  • 情報:
  • その呼び出しは、最初のプロジェクトであるその作業とまったく同じです。
  • otool -hv foo.a を使用 --> すべての lib.o に対して cputype が ARV V7 であることがわかります
  • lipo -info foo.a の使用 --> そのアーチを使用すると、foo.a が armv7 または armv7s であることがわかります。
  • nm foo.a | の使用 grep functionname --> 両方の arch をコンパイルすると、関数が armv7 と armv7s のライブラリ内にあることがわかります。

では、ライブラリが別のプロジェクトで機能し、関数が内部にある場合、なぜリンクの問題が発生するのでしょうか?


  • 情報 2:
  • 鬼のプロジェクトに foo ターゲットを追加すると、同じ問題が発生します。この方法に従ってください。
  • ターゲットの依存関係を追加しても機能しません。

このサンプルをコンパイルするための私の CmakeList は次のとおりです。

 # /////////////////////////////////////////////////////////
 # //SAMPLE 
 # /////////////////////////////////////////////////////////

 # 3rdParty (OGRE LOCATION)
set(OGRE_SDK_ROOT /Users/vgoni/Librerias/ogre1.9-pre/OgreSDK/ CACHE PATH "Ogre SDK ROOT")
set(OGRE_DEPENDENCIES_DIR ${OGRE_SDK_ROOT}/iOSDependencies CACHE PATH "Ogre SDK DEP")

 # Set up project
SET(PROJ_NAME ogreIOS)

PROJECT( ${PROJ_NAME} )
SET(PRODUCT_NAME ${PROJ_NAME})
SET(EXECUTABLE_NAME ${PROJ_NAME}Executable)

 # Add variable to generate iphone project in ADD_EXECUTABLE
SET(APP_TYPE MACOSX_BUNDLE)

 # Headers
SET(${PROJ_NAME}_HEADERS
    include/OgreStaticPluginLoader.h
    include/OgreDemoApp.h
    include/OgreFramework.h
    include/AppDelegate.h
    )

 # Source
SET(${PROJ_NAME}_SRC
    src/OgreFramework.cpp
    src/OgreDemoApp.cpp
    src/main.mm
)

 # Add there files to Resources package into XCODE
SET_SOURCE_FILES_PROPERTIES(
    resources/ogre.cfg
    resources/plugins.cfg
    resources/resources.cfg
    resources/ogreiosSample-Info.plist
    resources/ogreiosSample-Prefix.pch
    resources/en.lproj/InfoPlist.strings
    PROPERTIES
    MACOSX_PACKAGE_LOCATION Resources
)
 # Include self directories
INCLUDE_DIRECTORIES( include )

 # Include OGRE headers needed
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/include )
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/include/OIS )
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/include/OGRE )
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/include/OGRE/Overlay )
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/include/OGRE/iOS )
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/include/OGRE/RTShaderSystem )
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/include/OGRE/RenderSystems/GLES2 )
INCLUDE_DIRECTORIES( ${OGRE_SDK_ROOT}/iOSDependencies/include )

 # Link Directories where libraries needed are
LINK_DIRECTORIES( ${OGRE_SDK_ROOT}/lib/Release )
LINK_DIRECTORIES( ${OGRE_SDK_ROOT}/iOSDependencies/lib )
LINK_DIRECTORIES( ${OGRE_SDK_ROOT}/iOSDependencies/lib/Release )

 # Add ogre & boots libraries flags
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lmesaglsl2 -lboost_system -lboost_chrono -lboost_date_time -lboost_thread -lFreeType -lFreeImage -lzzip -lz -lc++ -lforce_load -lfoo")
 # foo is my library, force to load all to avoid fail in linking

 # 3rdParty ogre libraries
SET(OGRE_LIBS OIS OgreMainStatic RenderSystem_GLES2Static OgreRTShaderSystemStatic ) 

 # Link the libraries needed
 #TARGET_LINK_LIBRARIES (${PROJ_NAME} ${OGRE_LIBS})

 # Create executable for iOS
ADD_EXECUTABLE(
    ${EXECUTABLE_NAME}
        ${APP_TYPE}
        ${${PROJ_NAME}_HEADERS}
        ${${PROJ_NAME}_SRC}
)

 # Adding info to XCode project
 #set_target_properties(${EXECUTABLE_NAME}  PROPERTIES 
    #MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/resources/Info.plist)

 # Change name to make work Macros
SET(PROJ_NAME ogreIOSExecutable) 

 # Macro to add frameworks to Sample Executable
link_ios_framework(AssetsLibrary    ${EXECUTABLE_NAME})
link_ios_framework(AVFoundation     ${EXECUTABLE_NAME})
link_ios_framework(CoreMedia        ${EXECUTABLE_NAME})
link_ios_framework(CoreGraphics     ${EXECUTABLE_NAME})
link_ios_framework(CoreVideo        ${EXECUTABLE_NAME})
link_ios_framework(ImageIO          ${EXECUTABLE_NAME})
link_ios_framework(Foundation       ${EXECUTABLE_NAME})
link_ios_framework(OpenGLES         ${EXECUTABLE_NAME})
link_ios_framework(QuartzCore       ${EXECUTABLE_NAME})
link_ios_framework(UIKit            ${EXECUTABLE_NAME})

 # Needed dependencies
link_ios_sdk(libc++.1.dylib ${EXECUTABLE_NAME})
link_ios_sdk(libz.dylib ${EXECUTABLE_NAME})

 #Add OpenCV Libraries to link
TARGET_LINK_LIBRARIES (${PROJ_NAME} ${OpenCV_LIBS})

LINK_DIRECTORIES(
    ${LIBRARY_OUTPUT_PATH}
)
4

3 に答える 3

3

リンクするすべての関数を追加するライブラリごとに、フラグ -ObjC および -force_load を 1 回追加する必要があります。追加されていない関数による失敗を回避します。

たとえば、リンカの問題を引き起こしているため、lib boost_system に追加する cpp フラグを変更する必要があります。

SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lmesaglsl2 -force_load -lboost_system -lboost_chrono -lboost_date_time -lboost_thread -lFreeType -lFreeImage -lzzip -lz -lc++ -lforce_load -lfoo")

必要なすべてのライブラリにこのフラグを適用します。

于 2013-12-03T09:55:27.707 に答える