【问题标题】:Is there an easier way to compile this project有没有更简单的方法来编译这个项目
【发布时间】:2019-10-30 03:58:41
【问题描述】:

在 Linux(Ubuntu) 下,我正在用 CLion 编写一个 CMakeLists.txt 来编译我的项目,这是一个用 C 编写的小游戏。如何修复这些错误?

这是完整源代码的link

任何帮助将不胜感激

我试图重写我的 .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```

【问题讨论】:

  • 我假设deplacerJoueur 是您编写的函数?如果是这样,请确保您正在编译实现该函数的源文件。
  • 它在jeu.h 中被定义为原型。另外,既然你提到了,当我将鼠标指针悬停在 jeu.h 中的函数 jouer 上时,我看到 SDL_Surface 作为未知类型名称。
  • 在哪里实现的?您需要确保您正在构建该源文件。您的构建错误是因为链接器找不到该函数的实现。

标签: c cmake sdl clion


【解决方案1】:

如果您遇到此类错误,您需要逐个查看:


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. 在“main.c”中包含“jeu.c”而不是“jeu.h”,以及 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

由于所有错误,构建不成功,它会告诉你。

【讨论】:

  • 通过学习 C 课程并在这部分卡住了几个月。无论如何,你所说的一切都有帮助,因为我在另一个函数中使用了这些函数,并且 main.c 中包含的顺序也不是最好的。谢谢!
  • 通过下载正确的修复目标库问题并将其替换为我的系统上的使用/包含
猜你喜欢
  • 1970-01-01
  • 2016-01-29
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多