【问题标题】:Linking against SHARED library on Windows [duplicate]链接到 Windows 上的 SHARED 库 [重复]
【发布时间】:2018-09-25 06:24:55
【问题描述】:

我对 CMake 在 Windows 机器上处理库链接的方式有点困惑。下面我有一个简单的CMakeLists.txt 文件:

cmake_minimum_required (VERSION 3.10)
project (sample)

add_library (quad SHARED quad.cpp)

add_executable (run main.cpp)
target_link_libraries (run PRIVATE quad)

在 Linux/Mac 机器上,CMake 正确构建 *.so/*.dylib 库并将可执行文件链接到 *.so/*.dylib 文件。但是在 Windows 机器上,它会构建 *.dll 文件,然后尝试链接 *.lib 文件。

CMake 在底层执行以下命令:

>------ Build started: Project: CMakeLists, Configuration: Debug ------
[1/4] C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1415~1.267\bin\HostX64\x64\cl.exe  /nologo /TP -Dquad_EXPORTS  /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MDd /Zi /Ob0 /Od /RTC1 /showIncludes /FoCMakeFiles\quad.dir\quad.cpp.obj /FdCMakeFiles\quad.dir\ /FS -c C:\Users\UX\Workspace\sample\quad.cpp
[2/4] C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1415~1.267\bin\HostX64\x64\cl.exe  /nologo /TP   /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MDd /Zi /Ob0 /Od /RTC1 /showIncludes /FoCMakeFiles\run.dir\main.cpp.obj /FdCMakeFiles\run.dir\ /FS -c C:\Users\UX\Workspace\sample\main.cpp
[3/4] cmd.exe /C "cd . && "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_dll --intdir=CMakeFiles\quad.dir --manifests  -- C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1415~1.267\bin\Hostx64\x64\link.exe /nologo CMakeFiles\quad.dir\quad.cpp.obj  /out:quad.dll /implib:quad.lib /pdb:quad.pdb /dll /version:0.0 /machine:x64 /debug /INCREMENTAL  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib  && cd ."
[4/4] cmd.exe /C "cd . && "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\run.dir --manifests  -- C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1415~1.267\bin\Hostx64\x64\link.exe /nologo CMakeFiles\run.dir\main.cpp.obj  /out:run.exe /implib:run.lib /pdb:run.pdb /version:0.0  /machine:x64 /debug /INCREMENTAL /subsystem:console  quad.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
FAILED: run.exe 
cmd.exe /C "cd . && "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\run.dir --manifests  -- C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1415~1.267\bin\Hostx64\x64\link.exe /nologo CMakeFiles\run.dir\main.cpp.obj  /out:run.exe /implib:run.lib /pdb:run.pdb /version:0.0  /machine:x64 /debug /INCREMENTAL /subsystem:console  quad.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1415~1.267\bin\Hostx64\x64\link.exe /nologo CMakeFiles\run.dir\main.cpp.obj /out:run.exe /implib:run.lib /pdb:run.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console quad.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\run.dir/intermediate.manifest CMakeFiles\run.dir/manifest.res" failed (exit code 1104) with the following output:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\LINK : fatal error LNK1104: cannot open file 'quad.lib'
ninja: build stopped: subcommand failed.

Build failed.

我的问题是,当 CMake 文档说明以下内容时,为什么它会在 Windows 上失败:

target_link_libraries(<target>
                  <PRIVATE|PUBLIC|INTERFACE> <item>...
                 [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

item 在哪里可以是A library target name?它不应该从target 的属性中获得足够的信息来识别编译库的完整路径及其类型(即SHARED)以便能够正确链接可执行文件吗?

【问题讨论】:

    标签: windows cmake


    【解决方案1】:

    这就是链接在 Windows 中的工作方式。您需要一个 foo.lib 文件来链接到 foo.dll 库。这个.lib 是在.dll 本身被链接时产生的。您必须将 .lib 文件与库头一起分发。

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 2016-01-08
      • 2023-03-09
      • 2012-09-28
      • 1970-01-01
      • 2011-09-02
      • 2014-10-27
      • 1970-01-01
      相关资源
      最近更新 更多