【发布时间】: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。