Есть ли более простой способ скомпилировать этот проект? - PullRequest
0 голосов
/ 30 октября 2019

Под Linux (Ubuntu) я пишу CMakeLists.txt с CLion для компиляции моего проекта, представляющего собой небольшую игру, написанную на C. Как я могу исправить эти ошибки?

Вот ссылка ко всему исходному коду.

Любая помощь будет принята с благодарностью

Я пытался переписать мои .h файлы. Это было прежде всего проблемой связывания SDL и SDL_images.

Я попытался скомпилировать основной файл с помощью gcc main.c -o main -lSDL -lSDL_image.

Вот CMakeLists.txt

cmake_minimum_required(VERSION 3.7)

project(SOKOBAN)

set(CMAKE_C_STANDARD 99)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lmingw32")
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")

include_directories(${PROJECT_SOURCE_DIR}/include)
link_directories(${PROJECT_SOURCE_DIR}/lib)

find_package(SDL REQUIRED)
find_package(SDL)
find_package(SDL_image)



set(SOURCE_FILES main.c jeu.c jeu.h editeur.c editeur.h
        fichiers.c fichiers.h Constantes.h  hsokoban.h)

add_executable(SOKOBANR ${SOURCE_FILES})

target_link_libraries(SOKOBANR SDL_image SDL)

Ошибка:

[ 20%] Linking C executable SOKOBANR
CMakeFiles/SOKOBANR.dir/jeu.c.o: In function `jouer':
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:12: multiple definition of `jouer'
CMakeFiles/SOKOBANR.dir/main.c.o:/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:12: first defined here
/usr/bin/ld: skipping incompatible /home/mahamad/github/SOKOBAN/SOKOBAN/lib/libSDL.a when searching for -lSDL
CMakeFiles/SOKOBANR.dir/main.c.o: In function `jouer':
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:72: undefined reference to `deplacerJoueur'
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:76: undefined reference to `deplacerJoueur'
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:80: undefined reference to `deplacerJoueur'
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:84: undefined reference to `deplacerJoueur'
CMakeFiles/SOKOBANR.dir/jeu.c.o: In function `jouer':
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:72: undefined reference to `deplacerJoueur'
CMakeFiles/SOKOBANR.dir/jeu.c.o:/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:76: more undefined references to `deplacerJoueur' follow
CMakeFiles/SOKOBANR.dir/fichiers.c.o: In function `sauvegarderNiveau':
/home/mahamad/github/SOKOBAN/SOKOBAN/fichiers.c:67: undefined reference to `fprint'
collect2: error: ld returned 1 exit status
CMakeFiles/SOKOBANR.dir/build.make:128: recipe for target 'SOKOBANR' failed
make[3]: *** [SOKOBANR] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/SOKOBANR.dir/all' failed
make[2]: *** [CMakeFiles/SOKOBANR.dir/all] Error 2
CMakeFiles/Makefile2:84: recipe for target 'CMakeFiles/SOKOBANR.dir/rule' failed
make[1]: *** [CMakeFiles/SOKOBANR.dir/rule] Error 2
Makefile:118: recipe for target 'SOKOBANR' failed
make: *** [SOKOBANR] Error 2```

1 Ответ

2 голосов
/ 30 октября 2019

Если вы получаете такие ошибки, вам нужно просмотреть каждую из них:


CMakeFiles/SOKOBANR.dir/jeu.c.o: In function `jouer':
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:12: multiple definition of `jouer'
CMakeFiles/SOKOBANR.dir/main.c.o:/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:12: first defined here

Компоновщик считает, что у вас есть (как минимум) два определения jouer. Поскольку оба упомянутых местоположения одинаковы, я предполагаю, что вы 1. включаете «jeu.c» вместо «jeu.h» в свой «main.c» и 2. связываете «main.o» и «jeu.o».


/usr/bin/ld: skipping incompatible /home/mahamad/github/SOKOBAN/SOKOBAN/lib/libSDL.a when searching for -lSDL

Предоставленная вами библиотека "libSDL.a" не совместима с целевой системой. Похоже, ваша целевая система - Linux.

Для какой системы предназначена библиотека?

Вы скомпилировали ее самостоятельно или загрузили?


CMakeFiles/SOKOBANR.dir/main.c.o: In function `jouer':
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:72: undefined reference to `deplacerJoueur'
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:76: undefined reference to `deplacerJoueur'
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:80: undefined reference to `deplacerJoueur'
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:84: undefined reference to `deplacerJoueur'
CMakeFiles/SOKOBANR.dir/jeu.c.o: In function `jouer':
/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:72: undefined reference to `deplacerJoueur'
CMakeFiles/SOKOBANR.dir/jeu.c.o:/home/mahamad/github/SOKOBAN/SOKOBAN/jeu.c:76: more undefined references to `deplacerJoueur' follow

Есть ссылки (звонки) deplacerJoueur, но вы не определяете это. Или исходный файл с определением (реализацией) не добавляется в список модулей.


CMakeFiles/SOKOBANR.dir/fichiers.c.o: In function `sauvegarderNiveau':
/home/mahamad/github/SOKOBAN/SOKOBAN/fichiers.c:67: undefined reference to `fprint'

Это явно опечатка. Вы наверняка имеете в виду fprintf() с завершающим 'f'.


collect2: error: ld returned 1 exit status

Из-за всех ошибок компоновщик не работает, и он сообщает вам.


CMakeFiles/SOKOBANR.dir/build.make:128: recipe for target 'SOKOBANR' failed

Из-за всех ошибок сборка не удалась, и она говорит вам.

...