【问题标题】:Compiling a C program and linking编译 C 程序并链接
【发布时间】:2015-07-29 14:15:09
【问题描述】:

我是否正确理解如何使用 cmake 进行链接

cmake_minimum_required(VERSION 3.2)
project(Sdltest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -lmingw32 -lSDL2main -lSDL2")

set(SOURCE_FILES main.c)
add_executable(Sdltest ${SOURCE_FILES})

我正在尝试将 sdl2 链接到我的项目,但出现很多错误。

like /src/mingw-org-wsl/4.0-dev/src/libcrt/crt/main.c:91:未定义对“WinMain@16”的引用

当我在 cmd 上使用 gcc 时,它可以完美编译

gcc main.c -o test -Wall -Werror -lmingw32 -lSDL2main -lSDL2

顺便说一句,我使用的是 clion 1.0.5

【问题讨论】:

  • 现在请写 100 次:“C is not C++ is not C!”
  • @Olaf for (i = 0; i < 100; i++) C != C++ != C; 编译错误,请停止(是的,这里没有错字)。 :P

标签: c gcc cmake sdl


【解决方案1】:

问题在于标志,你混合了 compilerlinker 标志。首先这是有问题的,因为在链接时不使用编译器标志,其次是因为 GNU 链接器需要库位于命令行上的主要源(或对象)文件之后,就像手动构建时一样。

您可以在CMakeLists.txt 文件中使用target_link_libraries 命令设置库:

target_link_libraries(Sdltest mingw32 SDL2main SDL2)

另外,您不是在构建 C++ 项目,而是在构建 C 项目,因此 flags 变量应该是 CMAKE_C_FLAGS

最后,如果您想知道 CMake 在构建时使用的命令和参数,请尝试将 VERBOSE 设置为非零,例如

make VERBOSE=1

我确定可以将该参数添加到 CLion。


PS。

如果您想启用更多警告,您可以添加更多标志,例如-Wextra-pedantic。是的,它有时可能会产生误报,尤其是在包含来自外部库的头文件时,但我认为在开发时发出许多警告总比少发出警告要好。

【讨论】:

  • 顺便问一下,你知道为什么它会输出致命错误 Out of memory
  • 没关系,我在包含 sdl #define SDL_MAIN_HANDLED 之前添加了这个,一切正常,不知道为什么它在没有该代码的情况下与 gcc 一起工作,也许我会同时使用 gcc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2013-09-06
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多