Pergunta sobre cmake, c, cross-compiling – Posso pular testes do compilador cmake ou evitar “erro: opção não reconhecida '-dinâmico'”

26

Opções de compilação para cmake (no Windows) para o sistema de destino ARM, mas quando eu executo configure seus testes de compilador:

CMake Error at D:/Program Files/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
  The C compiler "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" is not
  able to compile a simple test program.

  It fails with the following output:

   Change Dir: D:/merge/complex/build/CMakeFiles/CMakeTmp



  Run Build Command:D:/PROGRA~1/YAGART~1/bin/make.exe "cmTryCompileExec/fast"

  D:/PROGRA~1/YAGART~1/bin/make.exe -f
  CMakeFiles/cmTryCompileExec.dir/build.make
  CMakeFiles/cmTryCompileExec.dir/build

  make.exe[1]: Entering directory
  `D:/merge/complex/build/CMakeFiles/CMakeTmp'

  "D:/Program Files/CMake 2.8/bin/cmake.exe" -E cmake_progress_report
  D:/merge/complex/build/CMakeFiles/CMakeTmp/CMakeFiles 1

  Building C object CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o

  "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" -o
  CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o -c
  D:/merge/complex/build/CMakeFiles/CMakeTmp/testCCompiler.c

  Linking C executable cmTryCompileExec

  "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe"
  "CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o" -o cmTryCompileExec
  -rdynamic 

  arm-none-eabi-gcc.exe: error: unrecognized option '-rdynamic'

  make.exe[1]: *** [cmTryCompileExec] Error 1

Usando o Yagatdo 4.6. * Toolchain cross-compilation

Como posso pular este teste ou corrigir o erro -rdynamic que estou recebendo?

Sua resposta

4   a resposta
1

teste cmake que o compilador pode gerar binários, você pode definir a variávelCMAKE_TRY_COMPILE_TARGET_TYPE.

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

https://cmake.org/cmake/help/latest/variable/CMAKE_TRY_COMPILE_TARGET_TYPE.html

25

Você pode pular as verificações do compilador adicionandoNONE para o seuproject ligar:

project(<projectname> NONE)

mas isso pode ter efeitos bastante abrangentes. Para detalhes completos, execute

cmake --help-command project

Eu não estou familiarizado com o ARM, então esta provavelmente não é sua melhor opção aqui. Eu acho que você seria melhor para ver se há uma maneira de corrigir o-rdynamic bandeira.

EDITAR:

Parece que isso foiidentificado como um bug que é efetivamente ainda não resolvido. Os comentários no relatório de erros mencionam a adição das linhas a seguir como uma solução alternativa (presumivelmenteproject ligar):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
@Sholy - OK, aqui está meu último palpite :-) Tente olhar paraesta discussão, mas observe que as configurações devem ser feitas antes doproject ligar. Fraser
para ser honesto, ainda está tentando testar ... mas, obrigado agora, acho que tenho informações suficientes para a pesquisa. Cynede
@Sholy Acabei de atualizar a resposta - espero que isso conserte isso para você. Fraser
Então yagarto é o mais sane compilador de braço afaik, eu não entendo porque "programa simples" solicitar este especial. Cynede
Eu vejo, mas eu estou recebendo a mesma saída com isso, infelizmente :( Cynede
20

LANG> _COMPILER_WORKS, por exemplo:

set(CMAKE_C_COMPILER_WORKS 1)

para suprimir outras verificações do compilador.

Você também pode precisar adicionar uma linha "CMAKE_CXX_COMPILER_WORKS" correspondente. Isso funcionou para mim em um caso em que, para um determinado alvo de compilação cruzada, o CMake insistia em usar o caminho errado da biblioteca e falhava em vincular o executável de teste, mas pegou o caminho certo para construções reais. Digicrat
23

então você deve dizer ao cmake que você está compilando para o caso genérico:

SET(CMAKE_SYSTEM_NAME Generic)

Seguido por (opcionalmente, mas é bom especificar):

SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_CROSSCOMPILING 1)

No entanto, se você especificar (o que você provavelmente fez porque isso é declarado em muitos exemplos online):

SET(CMAKE_SYSTEM_NAME Linux)

Então o cmake irá carregar os arquivos de configuração (suponha a versão 2.8) do arquivo:

/usr/share/cmake-2.8/Modules/Platform/Linux.cmake

do qual é provável que seja carregado:

/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake

Aqui o-rdynamic flag é definido por razões históricas:

macro(__linux_compiler_gnu lang)
  # We pass this for historical reasons.  Projects may have
  # executables that use dlopen but do not set ENABLE_EXPORTS.
  set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-rdynamic")
endmacro()

Em vez de desabilitar os testes, como de fato é feito especificandoNONE Enquanto oPROJECT argumento, parece definir oCMAKE_SYSTEM_NAME (para algo mais do queLinux, por exemploGeneric) é o que você realmente quer fazer.

Isso resolveu o problema para mim. O problema com a configuração de CMAKE_SHARED_LIBRARY_LINK_C_FLAGS é que-rdynamic é adicionado mesmo quando estamos apenas vinculando um executável com nenhuma biblioteca compartilhada envolvida. Mas mudar o nome do sistema para algo diferente do Linux funcionou. Eric Hein

Perguntas relacionadas