尽管启用了 POSITION_INDEPENDENT_CODE 标志,但使用 -fPIC 重新编译时出错

问题描述

我正在尝试通过 cmake 将 afinit_state.a 库与我的 C++ 项目链接起来。但我收到了 bolow 附加错误。我的 cmake 文件是:

cmake_minimum_required(VERSION 3.12)

project(java_telemetry_wrapper)

set(CMAKE_CXX_STANDARD 14)

find_package(JNI)
set(JAVA_INCLUDE_PATH "$ENV{JAVA_HOME}/include")
find_path(JAVA_INCLUDE_PATH jni.h ${JAVA_AWT_INCLUDE_DIRECTORIES})

set(JNI_LIBRARIES ${JAVA_AWT_LIBRARY} ${JAVA_JVM_LIBRARY})
set(JNI_INCLUDE_Dirs ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2} ${JAVA_AWT_INCLUDE_PATH})
set(STATE_PATH "/home/poc/src/state/")
set(LOGGER_PATH "../../logger")

include_directories(${JNI_INCLUDE_Dirs} ${STATE_PATH} ${LOGGER_PATH} ${AFN_STATE_INC} ${AFN_LOGGER_INC})
link_directories(/opt/lib/)

add_library(${PROJECT_NAME} SHARED header/TelemetryWrapper.h src/TelemetryWrapper.cpp ../telemetry.h ../telemetry.cpp ../common.hpp)
set_property(TARGET ${PROJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON)
target_link_libraries(${PROJECT_NAME} "-lpthread" afinit_state "-lz")

在发布这个问题之前,我已经尝试了我可以在互联网上找到的选项。很多人都说使用 set_property(TARGET ${PROJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON),我确实这样做了,但错误仍然存​​在。请帮助我缩小问题的范围,是什么导致了这个问题。

/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(af_state_service.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(StateSvcMsgQ.cc.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(StateSvcShmCtl2.cc.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(StateSvcShmCtl.cc.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(af_ss_agent_store.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(af_ss_call_store.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(af_ss_hashed_tbl.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(af_ss_mega_store.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(StateSvcMQ_Msgs.cc.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt//lib/libafinit_state.a(StateSvcObjDefs.cc.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: final link Failed: Nonrepresentable section on output
    collect2: error: ld returned 1 exit status
    make[2]: *** [CMakeFiles/java_telemetry_wrapper.dir/build.make:99: libjava_telemetry_wrapper.so] Error 1
    make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/java_telemetry_wrapper.dir/all] Error 2
    make: *** [Makefile:84: all] Error 2

解决方法

来自文档:https://cmake.org/cmake/help/latest/policy/CMP0083.html#policy:CMP0083

" CMP0083

3.14 版的新功能。

要控制是否生成位置无关可执行文件 (PIE),链接时需要一些标志。

CMake 3.13 及更低版本在设置 POSITION_INDEPENDENT_CODE 时没有添加这些链接标志。

此政策的 OLD 行为是不管理 PIE 链接标志。如果设置了 POSITION_INDEPENDENT_CODE,新行为是添加链接标志: "

IE 尝试使用较新版本的 CMake

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...