我在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}
)
您是否面臨類別問題? – Exploring
在創建foo.a時,是否將「僅生成活動架構」標誌設置爲「是」或「否」?我用該標誌修復了我的未定義符號錯誤,也許它有幫助 –
我已經嘗試了這兩個值。但我總是拒絕允許在ARMV7和ARMV7中執行,因爲我在不同的ipad版本中測試了 – vgonisanz