【问题标题】:CMake croscompile problem with CXX_FLAGS in linker链接器中 CXX_FLAGS 的 CMake 交叉编译问题
【发布时间】:2011-03-25 11:08:07
【问题描述】:

我在 mac os x 上有以下用于 iPhone 交叉编译的工具链:

# 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" \
                         "$@"

问题是,它也在链接器中使用了 CMAKE_CXX_FLAGS。编译没问题。链接看起来不错,它添加了正确的 -framework 标志,但也添加了 CMAKE_CXX_FLAGS(它们是 -x objective-c++),因此它不是链接先前编译的目标文件,它的行为就像编译目标 c++(-x 目标 c++),并且不可能链接这些对象。

我收到类似的错误

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

你不知道我做错了什么吗?

【问题讨论】:

    标签: c++ linker cmake cross-compiling objective-c++


    【解决方案1】:

    您可以将LINKER_LANGUAGE 设置为C 以强制CMake 将CMAKE_C_FLAGS 用于链接器。 Check it out here.

    【讨论】:

    • 这不是我感兴趣的。为什么将 CMAKE_C_FLAGS 传递给链接器?不应该只用于编译器吗?
    • 是的,在我看来它应该,但是 CMake 也将它传递给链接器,如果你检查文档,它说它会传递你的最高级别语言的 CMAKE_???_FLAGS使用,即如果您的项目中有1个C++文件,则传递CMAKE_CXX_FLAGS,否则为CMAKE_C_FLAGS。
    【解决方案2】:

    我通过从工具链文件中删除 CMAKE_CXX_FLAGS 和 CMAKE_C_FLAGS 并将 ADD_DEFINITIONS("-x objective-c++") 添加到 CMakeLists.txt 解决了这个问题。

    这样 -x Objective-c++ 标志只传递给编译器(而不是链接器)并且只传递给我的源代码(不是在构建我的目标之前发生的 cmake 测试编译)。

    【讨论】:

    【解决方案3】:

    链接命令行在 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 属性添加到目标来避免此问题。

    【讨论】:

    • 谢谢马布拉汉姆。这是一个非常有用的回复。我的情况略有不同,C、CXX 有不同的编译选项。 COMPILE_FLAGS 没有 COMPILE__FLAGS。设置 CMAKE__FLAGS 不是一个选项,因为它们也被传递给链接器。所以你的建议帮助解决了我的问题。
    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 2020-03-13
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多