我在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应该照顾到这一点而无法让我感到困惑...我错过了什么?
更新
在之前添加以下指令包括允许gcc正确链接:#define SDL_MAIN_HANDLED
根据我的阅读,SDL.h本身将main
函数重新定义为其头文件中的SDL_main
。添加此指令取消定义它(某种程度)。然而,目标是使程序在没有这个的情况下运行(因为该指令适用于命令行程序)。仍然没有线索...
答案 0 :(得分:0)
您可能需要添加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})
答案 1 :(得分:0)
据我所知,当您想使用SDL2时,您需要链接下一个拥有WinMain函数-lmingw32
(libSDL2.dll.a)的库-lSDL2main
-lSDL2
(libSDL2main)并应用该标志-mwindows
。对于第一个,我建议您用手将这些库和标志链接到库的完整路径。另外,如果您想知道变量存储的内容,可以编写message
。您怀疑它是完全链接。