Cmake compiler fout: Unknown extension ".c" for file

Pagina: 1
Acties:

Vraag


  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 23:10

Jazzy

Moderator SSC/PB

Moooooh!

Topicstarter
Ik probeer software te compileren, maar loop tegen een foutmelding aan. Kan het probleem reproduceren met een stukje proof of concept code, dus heeft nog niet eens met het echte doel te maken.

Compiler is gcc 4.8.2, Cmake 3.6.3 en draait op AIX 5.3. Wat oudere software, maar dat zou verder niet uit moeten maken.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
root@sr-2:/root/test>cmake .
-- The C compiler identification is unknown
-- Check for working C compiler: /opt/freeware/bin/gcc
CMake Error at /opt/freeware/share/cmake/Modules/CMakeTestCCompiler.cmake:47 (try_compile):
  Unknown extension ".c" for file

    /root/freeglut-3.8.0/test/CMakeFiles/CMakeTmp/testCCompiler.c

  try_compile() works only for enabled languages.  Currently these are:

    C

  See project() command to enable other languages.
Call Stack (most recent call first):
  CMakeLists.txt:2 (project)


-- Check for working C compiler: /opt/freeware/bin/gcc -- broken
CMake Error at /opt/freeware/share/cmake/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler "/opt/freeware/bin/gcc" is not able to compile a simple test
  program.

  It fails with the following output:





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:2 (project)


-- Configuring incomplete, errors occurred!
In regel 2 van CMakeLists.txt staat:
code:
1
project(test LANGUAGES C)
Begrijp uit die test niet goed wat er misgaat. Staat duidelijk dat C enabled is, waarom kan hij dan niet uit de voeten met een .c file?

Al een tijdje aan het proberen en heb onder andere -DCMAKE_C_COMPILER=/opt/freeware/bin/gcc gebruikt, geprobeerd om die test te omzeilen met -DCMAKE_C_COMPILER_WORKS=1, dat soort dingen. Tegen beter weten in gcc van 4.0.0 naar 4.8.2 bijgewerkt. Voor zowel gcc als Cmake zit ik nu op de meest recente versies die er zijn voor mijn OS.

Onder andere https://www.grokit.ca/cnt/CMakeProblemsSolutions/ gevonden maar daar is dus C nodig maar staan alleen CXX en RC als enabled, in mijn situatie staat C gewoon enabled.

De proof of concept code die ik nu gebruik om te testen heb ik gemaakt adhv.:
code:
1
2
3
4
5
6
7
8
9
mkdir test && cd test
cat > CMakeLists.txt <<EOF
cmake_minimum_required(VERSION 3.5)
project(test LANGUAGES C)
add_executable(hello hello.c)
EOF

echo 'int main(){return 0;}' > hello.c
cmake .
Kortom, Cmake klaagt dat ik geen C compiler en terwijl die er wel is. Iemand die me een zetje in de goede richting kan geven?

[ Voor 3% gewijzigd door Jazzy op 01-02-2026 17:46 ]

Exchange en Office 365 specialist. Mijn blog.

Alle reacties


  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 22:03
raar...

valt wel op dat ie zegt: "-- The C compiler identification is unknown", voordat je de eigenlijke foutmelding krijgt over die unknown extension ".c".

Normalister zie ik daar iets als "-- The C compiler identification is GNU 14.2.0" (op mijn Linux-machine)

Ik denk ook maar even mee: is het mogelijk dat dit geen cmake-probleem is maar dat je gcc daadwerkelijk stuk is? Wat als je hello.c met "de hand" compileert en runt? Wat zegt "gcc --version" ? (zonder expliciet path). Is dat wat anders dan "/opt/freeware/bin/gcc --version" ?

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 23:10

Jazzy

Moderator SSC/PB

Moooooh!

Topicstarter
Zowel gcc --version als /opt/freeware/bin/gcc --version geven dezelfde output. Ook nog even gechecked met which gcc, die vindt /usr/bin/gcc wat een symlink naar ../../opt/freeware/bin/gcc is.

Net nog even export CC=/opt/freeware/bin/gcc in mijn profiel gezet, maar zelfs zonder die variabele weet Cmake wel /opt/freeware/bin/gcc te vinden.

Als ik gcc hello.c doe krijg ik gewoon een a.out. Kan ik daar uit concluderen dat het geen gcc probleem is?

[ Voor 13% gewijzigd door Jazzy op 02-02-2026 16:21 ]

Exchange en Office 365 specialist. Mijn blog.


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21:20

BoAC

Memento mori


  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 23:10

Jazzy

Moderator SSC/PB

Moooooh!

Topicstarter
Ja, die heb ik doorgenomen maar niet in detail omdat daar een duidelijke mismatch is tussen .c en de 'enabled language' CXX. Bij mij staat C als enabled language.

Exchange en Office 365 specialist. Mijn blog.


  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 23:10

Jazzy

Moderator SSC/PB

Moooooh!

Topicstarter
Okay, beetje stom maar zit me blind te staren op die output die dus eigenlijk niets aan duidelijkheid geeft. Helemaal over het hoofd gezien dat daaronder ook nog staat:
code:
1
2
See also "/root/test/CMakeFiles/CMakeOutput.log".
See also "/root/test/CMakeFiles/CMakeError.log".
In /root/test/CMakeFiles/CMakeOutput.log eigenlijk niets bijzonders:
code:
1
2
3
4
5
6
7
8
9
Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
Compiler: /opt/freeware/bin/gcc
Build flags:
Id flags: -D__CLASSIC_C__

The output was:
0

Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out"
Maar in /root/test/CMakeFiles/CMakeError.log wel meer info over wat er fout gaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
The C compiler identification could not be found in "/root/test/CMakeFiles/3.6.3/CompilerIdC/a.out"

The C compiler identification could not be found in "/root/test/CMakeFiles/3.6.3/CompilerIdC/CMakeCCompilerId.o"

Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.
Compiler: /opt/freeware/bin/gcc
Build flags:
Id flags: -Aa

The output was:
1
<command-line>:0:1: error: missing '(' after predicate


The C compiler identification could not be found in "/root/test/CMakeFiles/3.6.3/CompilerIdC/a.out"

Checking whether the C compiler is IAR using "" did not match "IAR .+ Compiler":
gcc: fatal error: no input files
compilation terminated.
Determining if the C compiler works failed with the following output:
Is me niet helemaal duidelijk wat er gebeurt, maar in ieder geval meer aanknopingspunten. Als snap ik er nog geen fuck van.

Volgens Output.log is het gelukt:
Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.

Vervolgens klaagt Error.log dat het niet gelukt is:
Compiling the C compiler identification source file "CMakeCCompilerId.c" failed.

[ Voor 8% gewijzigd door Jazzy op 02-02-2026 17:30 ]

Exchange en Office 365 specialist. Mijn blog.


  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 23:10

Jazzy

Moderator SSC/PB

Moooooh!

Topicstarter
Okay, als ik het goed begrijp is één van de eerste stappen van het proces om allerlei informatie over je compiler te verzamelen. Dat gebeurt door CMakeCCompilerId.c te compileren en we weten inmiddels dat dit lukt en resulteert in een a.out. Toch klaagt cmake dat de "C compiler identification" niet gevonden kon worden in a.out. Die heb ik even in een text editor geopend en zie onder andere verwijzingen naar mijn gcc, maar kan natuurlijk niet zien wat er precies mist.

Vervolgens kan hij de C compiler identification ook niet vinden in CMakeCCompilerId.o. Ondanks dat die volgens Output.log wel gegenereerd zou moeten zijn, kan ik CMakeCCompilerId.o niet op mijn systeem vinden. Weet niet wat dat precies betekent.

Exchange en Office 365 specialist. Mijn blog.


  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 22:03
De foutmelding lijkt te zeggen dat de invocatie:
code:
1
gcc -Aa <file>.c
fout is. En strict genomen is dat ook zo volgens documentatie van gcc. Dat zou zo iets moeten zijn als:
code:
1
gcc -Aa=b <file>.c
of
code:
1
gcc "-Aa(b)" <file>.c # quote to prevent (..) to be processed by shell
Mijn C-compiler accepteert de eerste vorm echter wel. Misschien doet jouw gcc-versie (4.8.2 lijkt me best oud) dat niet?

Obscuur hoor!

  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 22:03
Hier staat nog wel iets interessants over die -Aa: https://www.daniweb.com/p...r-missing-after-predicate

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 23:10

Jazzy

Moderator SSC/PB

Moooooh!

Topicstarter
Interessant, bij mij levert die eerste notatie inderdaad die fout op:
code:
1
2
root@sr-2:/root/test>gcc -Aa hello.c
<command-line>:0:1: error: missing '(' after predicate
Dit werkt gewoon:
code:
1
root@sr-2:/root/test>gcc -Aa=b hello.c
Het is inderdaad obscuur, maar volgens mij vind jij dat helemaal niet erg. :) Dit is best een oude gcc versie, maar als je bedenkt dat die draait op hardware uit 2000 dan valt dat nog best wel mee.

Okay, ik begrijp nu waarom gcc struikelt over het formaat van -Aa en dat -Aa een switch is die je op HP-UX met de native cc gebruikt, ik draai ggc op AIX. Dat formaat heb ik inmiddels ook in de manpage gevonden:
code:
1
2
Preprocessor Options
              -Aquestion=answer -A-question[=answer]
Dan heb ik nog twee vragen:

- Als -Aa bedoeld is om op HP-UX de strict ANSI C mode en forceren, heb ik daar een alternatief voor nodig op AIX?

- Waar komt die -Aa switch nu eigenlijk vandaan, dat moet cmake zijn. Hoe voorkom ik dat cmake die switch meegeeft aan gcc?

Edit: is dit misschien gevolg van het probleem om mijn compiler te detecteren? Dat hij deze Id Flags meegeeft, denkt dat dit HP-UX is?

[ Voor 6% gewijzigd door Jazzy op 02-02-2026 21:47 ]

Exchange en Office 365 specialist. Mijn blog.


  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 22:03
Ja, dat vind ik niet erg :-)

Ik las 't ook: -A betekent op de native cc iets heel anders van op gcc. Ik zou ook vermoeden dat het iets met de compiler-detectie te maken heeft. cmake snapt niet dat 'ie te maken heeft met gcc en genereert (by default?) vlaggetjes voor de native cc. Maar ik weet ook even niet hoe dat te fixen

  • Jazzy
  • Registratie: Juni 2000
  • Laatst online: 23:10

Jazzy

Moderator SSC/PB

Moooooh!

Topicstarter
Je hebt me in ieder geval een heel stuk verder geholpen met pinpointen waar het precies misgaat, dankjewel daarvoor.

Inmiddels gezien dat ik cmake wel extra flags mee kan geven maar niet hoe ik er eentje kan verwijderen. Dan toch maar even kijken hoe ik die detectie kan fixen of overriden om te voorkomen dat hij die -Aa toevoegt. Lijkt me het handigst.

Exchange en Office 365 specialist. Mijn blog.


  • Mijzelf
  • Registratie: September 2004
  • Niet online
Je kunt je symlink /usr/bin/gcc vervangen door een script wat -Aa stript en dan de echte gcc aanroept.
Pagina: 1