Cmake не может добавить флаг "-fP IE" в make-файл - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь скомпилировать код C ++ со встроенным python. Компилятор не компилирует мой код с флагом '-fP IE', хотя я добавил его в CMakeList.txt. Вот мой 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, он сообщит о множестве похожих ошибок и попросит меня перекомпилировать с помощью '-fP IE', например: / usr / bin / ld: / usr / lib / gcc / x86_64- linux -gnu / 9 /../../../ x86_64- linux -gnu / lib python3 .8.a ( call.o): перемещение R_X86_64_32 против `.rodata.str1.8 'не может использоваться при создании объекта P IE; перекомпилируйте с -fP IE

Если я не использую 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. Как я могу исправить эти ошибки?

1 Ответ

0 голосов
/ 16 июня 2020

Обратите внимание, что в большинстве случаев эта ошибка не имеет ничего общего с флагом PIE, а скорее является чем-то еще неприятным в вашей сборке, к сожалению, это немного сложно сказать, потому что ваша конфигурация CMake немного странная.

Эта конкретная ошибка, вероятно, связана с неправильной настройкой свойств; Установка CMAKE_CXX_FLAGS и подобных переменных ничего не даст, если вы сделаете это после определения вашей цели с помощью add_executable. Этого можно полностью избежать, используя более современный стиль CMake (за рамками этого ответа, просто google Modern CMake для некоторых примеров), в этом конкретном случае вместо установки флагов для этих переменных вы могли бы, например сделать

target_compile_options(main PRIVATE -fpie)
...