由于缺少我们的CMake文件中的错误,我们正在赶上-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外,由于注册压力,该项目的政策对我们来说是无处不在的.意思是x86_64,ARM-32,Aarch32,Aarch64,MIPS,MIPS64,UltraSparc等.
我相信目标处理器是在CMAKE_SYSTEM_PROCESSOR中提供的。我遇到的问题是,文档没有告诉我值,所以我想不出如何创建一个“非32位x86”测试。
如何在x86中检测32位CMakeList.txt处理器?
更好的是,我希望看到CMake将CMAKE_SYSTEM_PROCESSOR设置为的处理器的全面列表。如果有人有这份清单,那么提供它就太好了。
发布于 2016-09-14 21:18:07
我可能会围绕编译器构建一些东西。
使用现有变量/模块的近似值是:
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位”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-14 05:20:42
我相信这会对除Windows之外的几乎所有东西执行检测。Windows不消耗-fPIC,所以对我来说并不重要。这些碎片是由三个堆叠溢出的答案粘在一起的。
# 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()您可以使用uname -m获得机器,即使在OS上也是如此。例如,在OS上,uname -p返回i386,而uname -m返回x86_64。我似乎记得10.6或10.7是有点古怪,因为过渡到64位的Mac。
有时您可以使用uname -p获得处理器,但它在许多开发板上都失败了。例如,我的ci20开发板返回机器的"mips“和处理器的”未知“。另一个例子是我的LeMaker HiKey。它为机器返回"aarch64“,对处理器返回”未知“。
我仍然希望看到Cmake提供的处理器列表。
https://stackoverflow.com/questions/39482157
复制相似问题