2013-10-29 45 views
4

我在OSX 10.9上使用XCode 5.0.1,並且鏈接libC++(LLVM C++標準庫)和有效體系結構armv7; armv7s和兩者。iOS靜態庫不鏈接XCODE 5 iOS 7

1º我創建了一個使用OpenCV2.framework + foo使用Cmake的項目,使用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 - >我看到cputype是ARV V7到所有lib.o
  • 使用lipo -info foo.a - >我看到foo.a是armv7或armv7s當我使用那個拱門。
  • 使用nm foo.a | grep functionname - >我看到這個函數是在armv7和armv7s的庫中進行編譯時。

那麼,如果圖書館在另一個項目中工作,並且功能在裏面,爲什麼會出現鏈接問題?


  • 信息2:
  • 添加foo的目標到ogre's項目,同樣的問題。按照THIS的方法。
  • 添加目標依賴關係也不起作用。

我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} 
) 
+0

您是否面臨類別問題? – Exploring

+0

在創建foo.a時,是否將「僅生成活動架構」標誌設置爲「是」或「否」?我用該標誌修復了我的未定義符號錯誤,也許它有幫助 –

+0

我已經嘗試了這兩個值。但我總是拒絕允許在ARMV7和ARMV7中執行,因爲我在不同的ipad版本中測試了 – vgonisanz

回答

3

您必須爲每個要添加所有函數鏈接的庫添加一次標誌-ObjC和-force_load,以避免因未添加函數而導致失敗。

例如,你必須改變你的cpp標誌增加LIB boost_system,因爲這是導致連接問題:

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") 

和lib你需要申請該標誌爲每一個。

+0

我目前面臨類似的問題。你介意在哪裏添加這個?謝謝。 –

0

基本的問題,你有沒有加入foo.a的鏈接庫?對於良好的目標(打開右側面板並檢查lib是否與所有需要的目標鏈接)?

+0

是的,我已經添加了它們。問題是該項目沒有找到某些功能。函數在庫中,因爲我可以使用otool看到它們,並且在ARMV7中使用其他函數,但其​​中一些函數不在。 – vgonisanz

2

Clang的鏈接器對庫鏈接順序有點嚴格,你可以嘗試交換項目中的鏈接順序來查看這是否是原因?

你能在這裏產生鏈接步驟命令行嗎?你只需要點擊按鈕有: enter image description here

而且,也許嘗試從其他連接器選項刪除-lfoo,因爲加入.a到您的項目就足夠了。

+0

我嘗試改變順序,嘗試幾種組合,但它沒有工作。我認爲正確的順序是OGRE,OPENCV,然後是我的庫,如CmakeLists.txt發佈。 – vgonisanz