Как заставить CMake не использовать некоторые флаги при линковке?

Я пытаюсь собрать приложение EFI с помощью CMake. По инструментам:
  • Clang (LLVM) - компилятор
  • LLD-link (Clang (LLVM)) - линкер
  • CMake 3.25
  • gnu-efi - заголовочные файлы


В данный момент CMakeLists.txt у меня выглядит следующим образом:
cmake_minimum_required(VERSION 3.25)
project(my_os)

set(CMAKE_CXX_STANDARD 17)

find_program(Clang_P clang++ REQUIRED True)
set(CMAKE_CXX_COMPILER ${Clang_P})

find_program(Clang_C clang REQUIRED True)
set(CMAKE_C_COMPILER ${Clang_C})

set(CMAKE_CXX_STANDARD_LIBRARIES "")
set(CMAKE_SYSTEM_NAME Generic)

include_directories("C:/gnu-efi/inc")

add_compile_options(-Wall -Wextra -pedantic)

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

set(CMAKE_C_COMPILER_TARGET  x86_64-unknown-windows)
set(CMAKE_CXX_COMPILER_TARGET  x86_64-unknown-windows)
add_compile_options(-ffreestanding)
add_compile_options(-fshort-wchar)
add_compile_options(-mno-red-zone)
add_compile_options(-masm=intel)

add_compile_options(-Wno-unused-command-line-argument)
add_compile_options(-Wno-c11-extensions)
add_compile_options(-Wno-c99-extensions)
add_compile_options(-Wno-language-extension-token)
add_compile_options(-Wno-microsoft-enum-value)
add_compile_options(-Wno-writable-strings)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld-link")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-entry:efi_main")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-subsystem:efi_application")

add_executable(my_os src/bootloader/entry.cpp)


Но при попытке собрать программу происходит следующее - CMake падает на моменте линковки, ибо clang не может обработать его флаги.
Итоговая команда линкера от CMake выглядит так:
clang++.exe -O3 -DNDEBUG -fuse-ld=lld-link -nostdlib -Wl,-entry:efi_main -Wl,-subsystem:efi_application CMakeFiles/my_os.dir/src/bootloader/entry.cpp.obj -o my_os.exe -Wl,--out-implib,libmelon_os.dll.a -Wl,--major-image-version,0,--minor-image-version,0


Соответственно, флаги
-Wl,--out-implib,libmelon_os.dll.a -Wl,--major-image-version,0,--minor-image-version,0

Абсолютно не к месту, на что clang начинает ругаться:

lld-link: warning: ignoring unknown argument '--out-implib'
lld-link: warning: ignoring unknown argument '--major-image-version'
lld-link: warning: ignoring unknown argument '--minor-image-version'
lld-link: error: could not open 'libmy_os.dll.a': no such file or directory
lld-link: error: could not open '0': no such file or directory
lld-link: error: could not open '0': no such file or directory
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.


Я не понимаю, как можно убрать их, и по какой причине CMake вообще ставит такие флаги
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы