【问题标题】:CMake fails to find libraryCMake 找不到库
【发布时间】:2018-09-12 03:41:14
【问题描述】:

我在 CLion 中有一个使用 CMake 的项目。我已经使用include_directories 命令添加了一个目录列表,尽管 IDE 可以正确找到它们并提供自动完成功能并且包含似乎正确链接,但当我尝试运行程序时,我会收到对所有函数的未定义引用的错误。

更新的 CMake 文件:

cmake_minimum_required(VERSION 3.9)
project(Test C)

set(CMAKE_C_STANDARD 11)
set(C_LIBRARIES_DIR E:/Work\ Related\ General/C\ Projects/Libraries)

# set paths (only needed on windows)
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  # where is the SDL2 development package copied to?
  set(SDL2_PATH "${C_LIBRARIES_DIR}/SDL2-2.0.8/i686-w64-mingw32")

  # add path do search path (windows requires ";" instead of ":" )
  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${C_LIBRARIES_DIR}/SDL2")
endif()

find_package(SDL2 REQUIRED)

include_directories(${SDL2_INCLUDE_DIR})

add_executable(Test src/main.c)

target_link_libraries(Test ${SDL2_LIBRARY})

我得到的错误如下:

"C:\Program Files\JetBrains\CLion 2017.3\bin\cmake\bin\cmake.exe" --build "E:\Work Related General\C Projects\Test\cmake-build-debug" --target Test -- -j 2
[ 25%] Linking C executable Test.exe
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [Test.exe] Error 1
CMakeFiles\Test.dir\build.make:152: recipe for target 'Test.exe' failed
mingw32-make.exe[2]: *** [CMakeFiles/Test.dir/all] Error 2
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/Test.dir/all' failed
mingw32-make.exe[1]: *** [CMakeFiles/Test.dir/rule] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/Test.dir/rule' failed
mingw32-make.exe: *** [Test] Error 2
Makefile:117: recipe for target 'Test' failed

我永远无法在网上找到关于 CMake 的好的帮助,而且 IDE 正确识别库但无法链接的事实让我感到困惑,因为 CLion 和 CMake 应该处理这个问题......我错过了什么?

更新 在 SDL 包含允许 gcc 正确链接之前添加以下指令之前#define SDL_MAIN_HANDLED

根据我的阅读,SDL.h 本身在其头文件中将 main 函数重新定义为 SDL_main。添加此指令会取消定义它(有点)。然而,目标是让程序在没有这个的情况下运行(因为这个指令用于命令行程序)。还是没有头绪……

【问题讨论】:

  • 您的标题 - CMake fails to find library - 可能暗示 target_link_libraries 中列出的某些库尚未找到。但实际上所有这些库都已找到。 (否则你会得到不同的错误信息)。错误消息undefined reference 表示这些库都不包含所需的符号。
  • 什么意思?我用新信息更新了问题,但问题仍然存在......
  • 我的意思是您的标题具有误导性 - CMake finds 库,但在其中找不到符号。在更新的问题中,只剩下一个“未定义的参考”。而that question 表明您尚未定义main() 函数。如果您希望 SDL2 定义此函数,请确保以正确的方式使用 FindSDL2.cmake 脚本。您拥有的脚本文档位于脚本开头的注释中,例如 here

标签: c gcc cmake mingw clion


【解决方案1】:

您可能需要添加一个 link_directories() 指令

另外,您也可以使用 pkg_check_modules() 来引用 SDL。以下内容可能不完全是您所需要的,但应该会给您一些想法

include(FindPkgConfig)
pkg_check_modules(ALL REQUIRED sdl2)

include_directories(${ALL_INCLUDE_DIRS})
link_directories(${ALL_LIBRARY_DIRS})

add_executable(Test main.c)

target_link_libraries(Test ${ALL_LIBRARIES})

【讨论】:

  • 我更新了 CMake 文件,但仍然遇到同样的问题。我的 CMake 没有 FindPkgConfig 也没有 pkg_check_modules 命令
  • @Konstantine 是的,如果您没有包配置设置,您可以尝试指定库目录。也可以试试 target_link_libraries()
  • 我的库有一个 pkgconfig 目录,但是里面有一个 sdl2.pc 文件。我应该尝试使用它吗?
  • @Konstantine 我认为 pkgconfig 是一种更好的使用模式,但如果这是一次性的,则没有必要。您是否尝试过 target_link_libraries()?它可能只是 target_link_libraries(Test sdl2) 或 target_link_libraries(Test libsdl2)
  • 查看更新的问题。我添加为相对路径,但找不到它们。如果我添加为绝对路径,我会得到同样的错误......
【解决方案2】:

据我所知,当您想使用 SDL2 时,您需要链接下一个库 -lmingw32 -lSDL2main(libSDL2main),这些库包含 WinMain 函数 -lSDL2(libSDL2.dll.a) 并应用标志 -mwindows。首先,我建议您使用库的完整路径将这些库和标志链接起来。此外,如果你想知道你的变量存储是什么,你可以写message。你的问题是它完全链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2011-12-26
    • 2013-04-21
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多