Cmake 无法将“-fPIE”标志添加到 makefile

Cmake cannot add "-fPIE" flag to makefile

我正在尝试编译嵌入了 python 的 C++ 代码。即使我在 CMakeList.txt 中添加了它,编译器也不会使用“-fPIE”标志编译我的代码。这是我的 CMakeList:

cmake_minimum_required(VERSION 3.3)
project(TestCython)

add_executable(main main.cpp)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-result -Wsign-compare -g -fdebug-prefix-map=/build/python3.8-6QL2k7/python3.8-3.8.2=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O3 -Wall -fPIE")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result -Wsign-compare -g -fdebug-prefix-map=/build/python3.8-6QL2k7/python3.8-3.8.2=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O3 -Wall -fPIE")

# Eigen
find_package(Eigen3 3.3 REQUIRED NO_MODULE)

# Embedded Python Includes
include_directories(/usr/include/python3.8
                    /usr/include/eigen3/    )

# Embedded Python Linker
link_directories(/usr/lib/python3.8/config-3.8-x86_64-linux-gnu
                 /usr/lib)

target_link_libraries(  main
            python3.8
            crypt
            pthread
            dl
            util
            m   )       

set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)

如果我运行生成的make文件,它会报告很多类似的错误并要求我用'-fPIE'重新编译,就像这个: /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libpython3.8.a(call.o): 搬迁 R_X86_64_32反对 `.rodata.str1.8' 在制作 PIE 对象时不能使用;使用 -fPIE

重新编译

不使用cmake编译成功:

g++ -I/usr/include/python3.8  -Wno-unused-result -Wsign-compare -g -fdebug-prefix-map=/build/python3.8-6QL2k7/python3.8-3.8.2=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O3 -Wall -fPIE main.cpp -o main -L/usr/lib/python3.8/config-3.8-x86_64-linux-gnu -L/usr/lib -lpython3.8 -lcrypt -lpthread -ldl  -lutil -lm

Cmake 版本为 3.16.3。 Python 版本为 3.8.2。系统是 Ubuntu 20.04 我该如何解决这些错误?

请注意,大多数情况下,此错误与 PIE 标志无关,而是与您的构建有关的其他问题,不幸的是,这有点难以判断,因为您的 CMake 配置有点问题.

然而,这个特定的错误可能是因为您设置的属性不正确;如果您在 定义您的目标add_executable 之后设置CMAKE_CXX_FLAGS 和类似的变量,则不会执行任何操作。这可以通过使用更现代的 CMake 样式(超出此答案的范围,只是 google Modern CMake 的一些例子)完全避免,在这种特殊情况下而不是设置例如,您可以对这些变量进行标记

target_compile_options(main PRIVATE -fpie)

当我将我的库 env2048(有一个名为 ppo_buffer 的文件)链接到我的绑定模块 env2048bindings:

时,我遇到了类似的错误
[build] FAILED: python/env2048bindings.cpython-37m-x86_64-linux-gnu.so 
[build] : && /usr/bin/g++-7 -fPIC -g   -shared  -o python/env2048bindings.cpython-37m-x86_64-linux-gnu.so python/CMakeFiles/env2048bindings.dir/env2048/bindings.cpp.o  src/libenv2048.a  -pthread && :
[build] /usr/bin/ld: src/libenv2048.a(ppo_buffer.cpp.o): relocation R_X86_64_PC32 against symbol `_ZSt3minIlERKT_S2_S2_' can not be used when making a shared object; recompile with -fPIC
[build] /usr/bin/ld: final link failed: Bad value

我必须设置 的属性以使其适用于:

set_target_properties(env2048 PROPERTIES POSITION_INDEPENDENT_CODE ON)

根据这些,我猜测您可能需要这个:

set_target_properties(python3.8 PROPERTIES POSITION_INDEPENDENT_CODE ON)