代码之家  ›  专栏  ›  技术社区  ›  thedarklord47

[MSVC][CMake][SDL_image]链接:致命错误LNK1104:无法打开文件'external\jpeg-9d\Debug\jpeg.lib'

  •  0
  • thedarklord47  · 技术社区  · 5 年前

    我通过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 但它也不导出符号(导致主项目构建中的链接失败)。

    0 回复  |  直到 5 年前