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)
我正在尝试编译嵌入了 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)