2010-08-04 65 views
3

我有以下工具鏈在Mac OS X iPhone crosscompilation:CMake的croscompile問題與連接CXX_FLAGS

# Platform Info 
SET (CMAKE_SYSTEM_VERSION 1) 
SET (CMAKE_SYSTEM_PROCESSOR arm) 

# SDK Info 
SET (SDKVER "3.0") 
SET (DEVROOT "/Developer/Platforms/iPhoneOS.platform/Developer") 
SET (SDKROOT "${DEVROOT}/SDKs/iPhoneOS${SDKVER}.sdk") 
SET (CMAKE_OSX_SYSROOT "${SDKROOT}") 
SET (CMAKE_OSX_ARCHITECTURES "armv6") 
SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE) 

# C Compiler 
SET (CMAKE_C_COMPILER "${DEVROOT}/usr/bin/arm-apple-darwin9-gcc-4.2.1") 
#SET (LINK_FLAGS "-arch armv6 -arch armv7") 
#SET (CMAKE_C_LINK_EXECUTABLE "${DEVROOT}/usr/bin/g++-4.2") 
SET (CMAKE_C_FLAGS "-x objective-c") 
SET (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -DDEBUG=1 -ggdb") 
SET (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -DNDEBUG=1") 
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -DNDEBUG=1 -ggdb") 

# CXX Compiler 
SET (CMAKE_CXX_COMPILER "${DEVROOT}/usr/bin/arm-apple-darwin9-g++-4.2.1") 
SET (CMAKE_CXX_FLAGS "-x objective-c++") 
SET (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -DDEBUG=1 -ggdb") 
SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -DNDEBUG=1") 
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} -DNDEBUG=1 -ggdb") 

# Definitions 
#ADD_DEFINITIONS("-arch armv6") 
#ADD_DEFINITIONS("-arch armv7") 
ADD_DEFINITIONS("-pipe") 
ADD_DEFINITIONS("-no-cpp-precomp") 
ADD_DEFINITIONS("--sysroot=${SDKROOT}") 
ADD_DEFINITIONS("-miphoneos-version-min=${SDKVER}") 

# System Includes 
INCLUDE_DIRECTORIES(SYSTEM "${SDKROOT}/usr/include") 
INCLUDE_DIRECTORIES(SYSTEM "${SDKROOT}/usr/include/c++/4.2.1") 
INCLUDE_DIRECTORIES(SYSTEM "${SDKROOT}/usr/include/c++/4.2.1/armv6-apple-darwin9") 
INCLUDE_DIRECTORIES(SYSTEM "${SDKROOT}/opt/iphone-${SDKVER}/include") 
INCLUDE_DIRECTORIES(SYSTEM "${SDKROOT}/usr/local/iphone-${SDKVER}/include") 

# System Libraries 
LINK_DIRECTORIES("${SDKROOT}/usr/lib") 
LINK_DIRECTORIES("${SDKROOT}/usr/lib/gcc/arm-apple-darwin9/4.2.1/") 
#LINK_DIRECTORIES("${SDKROOT}/opt/iphone-${SDKVER}/lib") 
#LINK_DIRECTORIES("${SDKROOT}/usr/local/iphone-${SDKVER}/lib") 

# Root Paths 
SET (CMAKE_FIND_ROOT_PATH "${SDKROOT}" "/opt/iphone-${SDKVER}/" "/usr/local/iphone-${SDKVER}/") 
SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) 
SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

# CMake Parameters 
SET (iPhone 1) 
SET (iPhoneOS 1) 
SET (iPhoneOS_VERSION ${SDKVER}) 
SET (CMAKE_CROSSCOMPILING 1) 

#SET_TARGET_PROPERTIES(p3dm PROPERTIES LINK_FLAGS "-arch armv6 -arch armv7") 

# HELPERS 
#--------- 

MACRO(ADD_FRAMEWORK appname fwname) 
    find_library(FRAMEWORK_${fwname} 
     NAMES ${fwname} 
     PATHS ${SDKROOT}/System/Library 
     PATH_SUFFIXES Frameworks 
     NO_DEFAULT_PATH) 
    if(${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND) 
     MESSAGE(ERROR ": Framework ${fwname} not found") 
    else() 
     TARGET_LINK_LIBRARIES(${appname} ${FRAMEWORK_${fwname}}) 
     MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}") 
    endif() 
endmacro(ADD_FRAMEWORK) 

我用下面的CMakeLists.txt:

# PROJECT PARAMETERS 
#-------------------- 

SET(APP_NAME p3dm) 
PROJECT(${APP_NAME}) 

# SOURCE CODE 
#------------- 

SET(CMAKE_CXX_FLAGS "-x objective-c++") 

INCLUDE_DIRECTORIES(SYSTEM ../inc/ ../xsrc/) 

FILE(GLOB headers ../src/*.h ../xsrc/*.h) 
FILE(GLOB sources ../src/*.cpp ../xsrc/*.c ../xsrc/*.cpp) 

#set_source_files_properties(${sources} PROPERTIES LANGUAGE C) 

# EXECUTABLE 
#------------ 

SET(MACOSX_BUNDLE_GUI_IDENTIFIER "org.reversity.${APPNAME}") 
SET(APP_TYPE MACOSX_BUNDLE) 

ADD_EXECUTABLE(${APP_NAME} ${APP_TYPE} ${headers} ${sources}) 

SET_TARGET_PROPERTIES(${APP_NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: Mario Hros") 

# FRAMEWORKS 
#------------ 

ADD_FRAMEWORK(${APP_NAME} UIKit) 

我用以下編譯bash腳本:

#!/bin/bash 

unset CPATH 
unset C_INCLUDE_PATH 
unset CPLUS_INCLUDE_PATH 
unset OBJC_INCLUDE_PATH 
unset LIBS 
unset DYLD_FALLBACK_LIBRARY_PATH 
unset DYLD_FALLBACK_FRAMEWORK_PATH 

export SDKVER="3.0" 
export DEVROOT="/Developer/Platforms/iPhoneOS.platform/Developer" 
export SDKROOT="$DEVROOT/SDKs/iPhoneOS$SDKVER.sdk" 
export PKG_CONFIG_PATH="$SDROOT/usr/lib/pkgconfig":"/opt/iphone-$SDKVER/lib/pkgconfig":"/usr/local/iphone-$SDKVER/lib/pkgconfig" 
export PKG_CONFIG_LIBDIR="$PKG_CONFIG_PATH" 
export MAINFOLDER=`pwd` 

cmake . \ 
         -DCMAKE_TOOLCHAIN_FILE="$MAINFOLDER/cmake/iphone-$SDKVER.toolchain" \ 
         -DCMAKE_INSTALL_PREFIX="/opt/iphone-$SDKVER" \ 
         "[email protected]" 

問題是,它也在鏈接器中使用CMAKE_CXX_FLAGS。彙編很好。鏈接看起來不錯,它添加了正確的框架標誌,但也添加了CMAKE_CXX_FLAGS(它們是-x objective-C++),所以不是鏈接先前編譯的目標文件,而是像編譯目標C++(-x objective-C++)那樣工作,鏈接這些對象。

ComponentManager.cpp.o:20: error: stray '\341' in program 

我得到的錯誤難道你不知道我做錯了什麼?

回答

2

我已經通過從工具鏈文件中刪除CMAKE_CXX_FLAGS和CMAKE_C_FLAGS並向CMakeLists.txt添加ADD_DEFINITIONS(「 - x objective-C++」)來解決此問題。

這樣-x objective-C++標誌只傳遞給編譯器(而不是鏈接器)並且僅用於我的源代碼(不是在構建我的目標之前發生的cmake測試編譯)。

+2

ADD_DEFINITIONS只應用於預處理器定義。以這種方式使用它可能會在未來導致其他問題。有關來源,請參閱http://www.cmake.org/Bug/view.php?id=12871#c28234。 – 2012-10-31 17:11:39

3

您可以將LINKER_LANGUAGE設置爲C以強制CMake使用CMAKE_C_FLAGS作爲鏈接器。 Check it out here.

+0

這不完全是我感興趣的。爲什麼CMAKE_C_FLAGS完全傳遞給鏈接器?它不應該只用於編譯器嗎? – k3a 2010-08-05 10:42:19

+1

是的,在我看來它應該,但CMake也將它傳遞給鏈接器,如果你檢查文檔,它說它會通過你使用的最高級別語言的CMAKE _ ??? _ FLAGS,即如果你有1 C++文件在你的項目中,CMAKE_CXX_FLAGS將被傳遞,否則它將是CMAKE_C_FLAGS。 – Gianni 2010-08-05 12:36:24

1

鏈接命令行在Modules/CMake {C,CXX,Fortran} Information.cmake中設置,並且默認使用編譯器及其編譯標誌(請參閱source code)。這可以通過替換構建鏈接命令行的規則來更改,該規則位於變量CMAKE_CXX_LINK_EXECUTABLE(和朋友)中。該變量不提供鏈接器可執行文件;它說如何鏈接一個可執行文件!

一種解決方案是設置該規則的修改形式,以避免使用CXX標記,例如,

cmake -DCMAKE_CXX_LINK_EXECUTABLE="<CMAKE_CXX_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") 

但是,您可以通過在第一時間沒有設置CMAKE_CXX_FLAGS,而是加入COMPILE_FLAGS屬性爲目標避免此問題。

+0

謝謝mabraham。這是一個非常有用的答覆。我的情況稍有不同,我對C,CXX有不同的編譯選項。 COMPILE_FLAGS沒有COMPILE_ _FLAGS。設置CMAKE_ _FLAGS不是一個選項,因爲它們也被傳遞給鏈接器。所以你的建議幫助解決了我的問題。 – 2015-05-06 05:25:52