我通过git子模块将SDL和SDL_image作为项目依赖项。SDL_image本身包含多个外部依赖项,包括有问题的
jpeg
图书馆整个项目结构如下所示:
â CMakeLists.txt
ââââbuild
ââââsrc
ââââexternal
ââââSDL (git submodule)
ââââSDL_image (git submodule)
â CMakeLists.txt
ââââexternal
ââââjpeg-9d
ââââlibpng-1.6.37
ââââlibwebp-1.0.3
ââââtiff-4.2.0
ââââzlib-1.2.11
我正在使用以下顶级CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(GameTemplate VERSION 1.0.0
LANGUAGES CXX)
# define common SOURCES variable as all files within src
file(GLOB_RECURSE SOURCES src/*)
# add main executable (entry point + SOURCES)
# in windows, WIN32 property adds /SUBSYSTEM:WINDOWS compiler flag
# required for GUI applications
add_executable(${PROJECT_NAME} WIN32 ${SOURCES})
# SDL (shared only)
# NOTE: setting SDL_STATIC to ON has no effect on jpeg output,
# it just prevents building the SDLstatic target unnecessarily
set(SDL_STATIC OFF CACHE BOOL "build SDL static lib" FORCE)
add_subdirectory(external/SDL EXCLUDE_FROM_ALL)
add_subdirectory(external/SDL_image EXCLUDE_FROM_ALL)
# includes
target_include_directories(GameTemplate
PRIVATE external/SDL/include
PRIVATE external/SDL_image
PRIVATE src)
# linker
target_link_libraries(GameTemplate
PRIVATE SDL2main
PRIVATE SDL2
PRIVATE SDL2_image)
以下构建步骤在macOS上是成功的:
$ cd build
$ cmake ..
$ make
在尝试构建SDL_image目标时,等效的MSVC构建步骤失败,并出现以下错误
$ cd build
$ cmake ..
$ MSBuild.exe .\GameTemplate.sln
...
Link:
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30037\bin\HostX64\x64\link.exe /ERRORREPOR
T:QUEUE /OUT:"C:\Users\colev\workspace\game-template\build\external\SDL_image\Debug\SDL2_image.dll" /INCREMENTAL /ILK:"SDL2_i
mage.dir\Debug\SDL2_image.ilk" /NOLOGO "external\jpeg-9d\Debug\jpeg.lib" "external\libpng-1.6.37\Debug\libpng16d.lib" ..\SDL\
Debug\SDL2d.lib "external\zlib-1.2.11\Debug\zlibd.lib" kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib o
leaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /D
EBUG /PDB:"C:/Users/colev/workspace/game-template/build/external/SDL_image/Debug/SDL2_image.pdb" /SUBSYSTEM:CONSOLE /TLBID:1
/DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/Users/colev/workspace/game-template/build/external/SDL_image/Debug/SDL2_image.lib" /MACHIN
E:X64 /machine:x64 /DLL SDL2_image.dir\Debug\IMG.obj
SDL2_image.dir\Debug\IMG_png.obj
SDL2_image.dir\Debug\IMG_bmp.obj
SDL2_image.dir\Debug\IMG_gif.obj
SDL2_image.dir\Debug\IMG_jpg.obj
SDL2_image.dir\Debug\IMG_lbm.obj
SDL2_image.dir\Debug\IMG_pcx.obj
SDL2_image.dir\Debug\IMG_pnm.obj
SDL2_image.dir\Debug\IMG_svg.obj
SDL2_image.dir\Debug\IMG_tga.obj
SDL2_image.dir\Debug\IMG_tif.obj
SDL2_image.dir\Debug\IMG_webp.obj
SDL2_image.dir\Debug\IMG_WIC.obj
SDL2_image.dir\Debug\IMG_xcf.obj
SDL2_image.dir\Debug\IMG_xpm.obj
SDL2_image.dir\Debug\IMG_xv.obj
SDL2_image.dir\Debug\IMG_xxx.obj
LINK : fatal error LNK1104: cannot open file 'external\jpeg-9d\Debug\jpeg.lib' [C:\Users\me\workspace\game-template\build\ex
ternal\SDL_image\SDL2_image.vcxproj]
果不其然,那个文件不在
build\external\SDL_image\external\jpeg-9d\Debug
,只有
.dll
这个
.lib
是否存在所有其他SDL_image外部dep。。。
$ ls build\external\SDL_image\external\jpeg-9d\Debug\
-a---- 7/2/2021 2:19 PM 513024 jpeg.dll
-a---- 7/2/2021 2:19 PM 1232896 jpeg.pdb
$ ls build\external\SDL_image\external\libpng-1.6.37\Debug\
-a---- 7/2/2021 2:19 PM 423424 libpng16d.dll
-a---- 7/2/2021 2:19 PM 33612 libpng16d.exp
-a---- 7/2/2021 2:19 PM 56196 libpng16d.lib
-a---- 7/2/2021 2:19 PM 1200128 libpng16d.pdb
如果我cd到
external\SDL_image\external\jpeg-9d\
并自行构建jpeg,它确实会生成
.lib
文件,但我对windows的理解是
.lib
可以是静态链接库,也可以是相应的导出库
.dll
.我想在建造时
jpeg
我自己正在构建静态链接库
.lib
我的主要构建实际需要的是导出库。
如果是这样,为什么不呢
jpeg
使用构建时,还构建导出库
BUILD_SHARED_LIBS
? 在没有导出库的情况下构建dll不是有点无用吗?
编辑:我刚刚发现这个答案表明
.lib
如果库不导出任何符号,则不会生成文件。我认为这不太可能,因为jpeg是一个流行的库,但有没有办法我可以检查一下以确定?
https://stackoverflow.com/a/7615698/1800023
编辑2:我找到了
DUMPBIN
并确认没有导出的文件
jpeg.dll
…那怎么可能呢?
编辑3:禁用JPG会导致生成
SDL2_image.dll
但它也不导出符号(导致主项目构建中的链接失败)。