CMake 没有在 Windows 上链接库

Los*_*les 5 windows linker sdl mingw cmake

介绍

我有一个使用 SDL2 的项目。构建系统是 cmake,我试图让它在 Windows 上构建(它需要在 Windows 上构建,因为这将主要在 Windows 上使用)。在 Linux 上,它几乎是在第一次尝试的基础上构建的。在 Windows 上,过去 3 个小时我一直在努力解决这个问题,但一点运气都没有。

在 Linux 上,我刚刚安装了 SDL 软件包,但在 Windows 上我尝试包含本地副本。我的 CMakeLists.txt 文件如下所示:

include_directories(../include)

# Add libraries for linux
if(UNIX)
    enable_language(ASM)
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(SDL_PKG sdl2)
    if(NOT SDL_PKG_FOUND)
        message(FATAL_ERROR "No sdl found")
    endif()
    include_directories(${SDL_PKG_INCLUDE_DIRS})
    LIST(APPEND LIBS ${SDL_PKG_LIBRARIES})
endif()

# Add libraries for windows
if(WIN32)
    include_directories(../sdl-mingw/include/SDL2)
    LIST(APPEND LIBS ${CMAKE_SOURCE_DIR}/sdl-mingw/lib/libSDL2.a)
endif()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-long-long")

set(SOURCES main.c paddles.c pong.c assets.S)
set_property(SOURCE assets.S PROPERTY LANGUAGE C)
add_executable(pong ${SOURCES})

target_link_libraries(pong ${LIBS})

install(TARGETS pong DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)

构建项目后,我得到以下输出(滚动到底部查看令人兴奋的部分):

-------------- Clean: all in pong (compiler: GNU GCC Compiler)---------------

C:/PROGRA~2/CODEBL~1/MinGW/bin/mingw32-make.exe -f CMakeFiles\Makefile2 clean
mingw32-make.exe[1]: Entering directory `C:/Users/Kevin/Documents/pong/build'
C:/PROGRA~2/CODEBL~1/MinGW/bin/mingw32-make.exe -f src\CMakeFiles\pong.dir\build.make src/CMakeFiles/pong.dir/clean
mingw32-make.exe[2]: Entering directory `C:/Users/Kevin/Documents/pong/build'
cd /d C:\Users\Kevin\Documents\pong\build\src && "C:\Program Files (x86)\CMake\bin\cmake.exe" -P CMakeFiles\pong.dir\cmake_clean.cmake
mingw32-make.exe[2]: Leaving directory `C:/Users/Kevin/Documents/pong/build'
mingw32-make.exe[1]: Leaving directory `C:/Users/Kevin/Documents/pong/build'
Cleaned "pong - all"

-------------- Build: all in pong (compiler: GNU GCC Compiler)---------------

Running command: C:/PROGRA~2/CODEBL~1/MinGW/bin/mingw32-make.exe -f "C:/Users/Kevin/Documents/pong/build/Makefile"  VERBOSE=1 all
"C:\Program Files (x86)\CMake\bin\cmake.exe" -HC:\Users\Kevin\Documents\pong -BC:\Users\Kevin\Documents\pong\build --check-build-system CMakeFiles\Makefile.cmake 0
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_progress_start C:\Users\Kevin\Documents\pong\build\CMakeFiles C:\Users\Kevin\Documents\pong\build\CMakeFiles\progress.marks
C:/PROGRA~2/CODEBL~1/MinGW/bin/mingw32-make.exe -f CMakeFiles\Makefile2 all
mingw32-make.exe[1]: Entering directory `C:/Users/Kevin/Documents/pong/build'
C:/PROGRA~2/CODEBL~1/MinGW/bin/mingw32-make.exe -f src\CMakeFiles\pong.dir\build.make src/CMakeFiles/pong.dir/depend
mingw32-make.exe[2]: Entering directory `C:/Users/Kevin/Documents/pong/build'
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles" C:\Users\Kevin\Documents\pong C:\Users\Kevin\Documents\pong\src C:\Users\Kevin\Documents\pong\build C:\Users\Kevin\Documents\pong\build\src C:\Users\Kevin\Documents\pong\build\src\CMakeFiles\pong.dir\DependInfo.cmake --color=
mingw32-make.exe[2]: Leaving directory `C:/Users/Kevin/Documents/pong/build'
C:/PROGRA~2/CODEBL~1/MinGW/bin/mingw32-make.exe -f src\CMakeFiles\pong.dir\build.make src/CMakeFiles/pong.dir/build
mingw32-make.exe[2]: Entering directory `C:/Users/Kevin/Documents/pong/build'
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_progress_report C:\Users\Kevin\Documents\pong\build\CMakeFiles 1
[ 33%] 
Building C object src/CMakeFiles/pong.dir/main.c.obj
cd /d C:\Users\Kevin\Documents\pong\build\src && C:\PROGRA~2\CODEBL~1\MinGW\bin\gcc.exe   -Wall -Wno-long-long @CMakeFiles/pong.dir/includes_C.rsp   -o CMakeFiles\pong.dir\main.c.obj   -c C:\Users\Kevin\Documents\pong\src\main.c
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_progress_report C:\Users\Kevin\Documents\pong\build\CMakeFiles 2
[ 66%] 
Building C object src/CMakeFiles/pong.dir/paddles.c.obj
cd /d C:\Users\Kevin\Documents\pong\build\src && C:\PROGRA~2\CODEBL~1\MinGW\bin\gcc.exe   -Wall -Wno-long-long @CMakeFiles/pong.dir/includes_C.rsp   -o CMakeFiles\pong.dir\paddles.c.obj   -c C:\Users\Kevin\Documents\pong\src\paddles.c
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_progress_report C:\Users\Kevin\Documents\pong\build\CMakeFiles 3
[100%] Building C object src/CMakeFiles/pong.dir/pong.c.obj
cd /d C:\Users\Kevin\Documents\pong\build\src && C:\PROGRA~2\CODEBL~1\MinGW\bin\gcc.exe   -Wall -Wno-long-long @CMakeFiles/pong.dir/includes_C.rsp   -o CMakeFiles\pong.dir\pong.c.obj   -c C:\Users\Kevin\Documents\pong\src\pong.c
Linking C executable pong.exe
cd /d C:\Users\Kevin\Documents\pong\build\src && "C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\pong.dir\link.txt --verbose=1
"C:\Program Files (x86)\CMake\bin\cmake.exe" -E remove -f CMakeFiles\pong.dir/objects.a
C:\PROGRA~2\CODEBL~1\MinGW\bin\ar.exe cr CMakeFiles\pong.dir/objects.a @CMakeFiles\pong.dir\objects1.rsp
C:\PROGRA~2\CODEBL~1\MinGW\bin\gcc.exe   -Wall -Wno-long-long   -Wl,--whole-archive CMakeFiles\pong.dir/objects.a -Wl,--no-whole-archive  -o pong.exe -Wl,--out-implib,libpong.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\pong.dir\linklibs.rsp
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x7c): undefined reference to `SDL_PollEvent'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x12a): undefined reference to `SDL_RenderCopy'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x393): undefined reference to `SDL_SetRenderDrawColor'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x3a0): undefined reference to `SDL_RenderClear'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x4a3): undefined reference to `SDL_RenderCopy'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x4d0): undefined reference to `SDL_SetRenderDrawColor'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x4e7): undefined reference to `SDL_RenderFillRect'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x4fe): undefined reference to `SDL_RenderFillRect'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x52b): undefined reference to `SDL_SetRenderDrawColor'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x55b): undefined reference to `SDL_RenderFillRect'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x58b): undefined reference to `SDL_RenderFillRect'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x598): undefined reference to `SDL_RenderPresent'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x5b9): undefined reference to `SDL_Init'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x5c2): undefined reference to `SDL_GetError'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x61e): undefined reference to `SDL_CreateWindow'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x62c): undefined reference to `SDL_GetError'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x66f): undefined reference to `SDL_CreateRenderer'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x677): undefined reference to `assets_font_size'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x682): undefined reference to `assets_font'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x687): undefined reference to `SDL_RWFromMem'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x695): undefined reference to `SDL_GetError'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x6d0): undefined reference to `SDL_LoadBMP_RW'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x6e5): undefined reference to `SDL_CreateTextureFromSurface'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x6f4): undefined reference to `SDL_GetError'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x727): undefined reference to `SDL_FreeSurface'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x72c): undefined reference to `assets_sprites_size'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x737): undefined reference to `assets_sprites'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x73c): undefined reference to `SDL_RWFromMem'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x74a): undefined reference to `SDL_GetError'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x785): undefined reference to `SDL_LoadBMP_RW'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x79a): undefined reference to `SDL_CreateTextureFromSurface'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x7a9): undefined reference to `SDL_GetError'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x7dc): undefined reference to `SDL_FreeSurface'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x844): undefined reference to `SDL_DestroyTexture'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x84f): undefined reference to `SDL_DestroyRenderer'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x85a): undefined reference to `SDL_DestroyWindow'
CMakeFiles\pong.dir/objects.a(pong.c.obj):pong.c:(.text+0x85f): undefined reference to `SDL_Quit'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [src/pong.exe] Error 1
mingw32-make.exe[1]: *** [src/CMakeFiles/pong.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2
mingw32-make.exe[2]: Leaving directory `C:/Users/Kevin/Documents/pong/build'
mingw32-make.exe[1]: Leaving directory `C:/Users/Kevin/Documents/pong/build'
Process terminated with status 2 (0 minute(s), 3 second(s))
37 error(s), 0 warning(s) (0 minute(s), 3 second(s))
 
Run Code Online (Sandbox Code Playgroud)

令人兴奋的部分是所有那些未定义的符号。其中大部分来自 SDL,但也有一些来自assets.S(您可以在此处查看)。

问题

为什么我的文件似乎libSDL2.a没有链接到可执行文件中?

assets.S另外,为什么链接器也看不到我的文件中导出的符号?

我检查了该linklibs.rsp文件,它确实列出了libSDL2.a. 如果我更改名称,make 会很不高兴,所以我认为这意味着链接器正在读取文件。通常我可以解决这类问题,但我在这方面毫无进展。

肮脏的细节

Windows 8 上的 CMake

使用 MinGW 为 Code::Blocks 配置的 CMake 构建(使用 code::blocks 安装的)

SDL 2.0.3

完整的源码在这里: https: //github.com/kcuzner/pong