0

由于缺少-fPIC. _ 她来自 ci20 MIPS 开发板:

...
[ 92%] Built target cryptopp-object
Scanning dependencies of target cryptopp-shared
Scanning dependencies of target cryptopp-static
Linking CXX static library libcryptopp.a
Linking CXX shared library libcryptopp.so
/usr/bin/ld: CMakeFiles/cryptopp-object.dir/cryptlib.cpp.o: relocation R_MIPS_HI16 against
`a local symbol' can not be used when making a shared object; recompile with -fPIC
CMakeFiles/cryptopp-object.dir/cryptlib.cpp.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

由于注册压力,该项目的政策是除了 32 位 x86 之外的所有地方都向我们提供 PIC。这意味着 x86_64、ARM-32、Aarch32、Aarch64、MIPS、MIPS64、UltraSparc 等获得 PIC。

我相信目标处理器是在CMAKE_SYSTEM_PROCESSOR. 我遇到的问题是文档没有告诉我值,所以我无法弄清楚如何制作“非 32 位 x86”测试。

如何在 CMakeList.txt 中检测 32 位 x86 处理器?

更好的是,我希望看到 CMake 设置的处理器的完整列表CMAKE_SYSTEM_PROCESSOR。如果有人有清单,那么提供它会很棒。

4

2 回答 2

1

我可能会围绕编译器构建一些东西。

使用现有变量/模块的近似值是:

include(TestBigEndian)

if (NOT WIN32)
    TEST_BIG_ENDIAN(_bigendian)
    if((CMAKE_SIZEOF_VOID_P GREATER 4) OR (_bigendian))
        message(
            STATUS "Setting ${CMAKE_CXX_COMPILE_OPTIONS_PIC} "
                   "for machine ${CMAKE_HOST_SYSTEM_PROCESSOR}"
        )
        set(CMAKE_POSITION_INDEPENDENT_CODE 1)
    endif()
endif()

简而言之,我做了什么:

  • WIN32也适用于 64 位 Windows 编译器/环境
  • CMAKE_SIZEOF_VOID_P GREATER 4检查“大于 32 位”
  • 最后一个是最大的假设:把所有的小端处理器都当作基于 Intel/AMD 的处理器
  • 使用更通用CMAKE_POSITION_INDEPENDENT_CODE的设置-fPIC

我承认更准确的方法是围绕预定义的宏测试构建一些东西。

编辑:添加了“预定义宏检查”替代

这是对预定义宏的更精确检查:

include(CheckCXXSourceCompiles)

if (CMAKE_CXX_COMPILE_OPTIONS_PIC)
    set(
        _preDefMacrosX86 
            __i386 __i386__ __i486__ __i586__ __i686__      
            _M_I86 _M_IX86 __X86__ _X86_ __THW_INTEL__
            __I86__ __INTEL__ __386
    )
    set(_code "void main() {}")
    foreach(_macro IN LISTS _preDefMacrosX86)
        set(
            _code
            "${_code}\n\#ifdef ${_macro}\n\#error ${_macro} is defined\n\#endif"
        )
    endforeach()
    CHECK_CXX_SOURCE_COMPILES("${_code}" _canCompileX86DoesFailCheck)

    if((CMAKE_SIZEOF_VOID_P GREATER 4) OR (_canCompileX86DoesFailCheck))
        message(STATUS "Setting ${CMAKE_CXX_COMPILE_OPTIONS_PIC}")
        set(CMAKE_POSITION_INDEPENDENT_CODE 1)
    endif()
endif()

参考

于 2016-09-14T21:18:07.623 回答
0

我相信这会对除了 Windows 之外的几乎所有东西进行检测。Windows 不消耗-fPIC,所以对我来说没关系。这些碎片是从三个 Stack Overflow 答案中粘在一起的。

# Stop hiding the damn output...
set(CMAKE_VERBOSE_MAKEFILE on)

# Enable PIC for all targets except Windows and 32-bit x86
if (NOT (WINDOWS OR WINDOWS_STORE OR WINDOWS_PHONE))

    set (UNAME_CMD "uname")
    set (UNAME_ARG "-m")
    execute_process(COMMAND ${UNAME_CMD} ${UNAME_ARG}
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        RESULT_VARIABLE UNAME_RESULT
        OUTPUT_VARIABLE UNAME_MACHINE)

    # Use Regex; match i386, i486, i586 and i686
    IF (NOT (${UNAME_MACHINE} MATCHES "i.86"))
        # message(STATUS "Setting -fPIC for machine ${UNAME_MACHINE}")
        if (CMAKE_VERSION VERSION_LESS 2.8.12)
            add_definitions(-fPIC)
        else()
            add_compile_options(-fPIC)
        endif()
    endif()
endif()

即使在 OS X 上,您也可以得到带有 的机器uname -m,并且它大部分是准确的。例如,在 OS X 上,uname -p返回i386uname -m返回x86_64。我似乎记得 10.6 或 10.7 在过渡到 64 位 Mac 时有点不稳定。

你有时会得到处理器uname -p,但它在许多开发板上都失败了。例如,我的ci20 开发板返回机器的“mips”和处理器的“未知”。另一个例子是我的LeMaker HiKey。它为机器返回“aarch64”,为处理器返回“未知”。


我还是想看看 Cmake 提供的处理器列表。

于 2016-09-14T05:20:42.837 回答