针对dll/lib的cmake链接

h_b*_*h_b 8 c++ dll cmake static-libraries

我的cmake的输出是一个静态库.我正在创建它:

add_library(myMainLib STATIC ${BACKEND_SOURCES})
Run Code Online (Sandbox Code Playgroud)

当我尝试让myMainLib链接到第三方lib/dll时出现问题.dll文件将在运行时找到,但是,我正在尝试导入/链接lib文件,但没有成功.我的第三方库是SDL2和SDL2 NET.

我认为这是直截了当的,并且已经用尽了我在网上找到的所有方法.都失败了.我尝试过的列表如下.请告诉我我做错了什么.

  1. 简单的方法,使用target_link_libraries

    add_library(myMainLib STATIC ${BACKEND_SOURCES})
    
    target_link_libraries(myMainLib path_to_thirdPartyLib/thirdParty.lib)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根据cmake docs

    add_library(myMainLib STATIC ${BACKEND_SOURCES})
    
    add_library(Third_Party SHARED IMPORTED)
    
    set_property(TARGET Third_Party PROPERTY IMPORTED_LOCATION path_to_thirdPartyLib/thirdParty.dll)
    
    set_property(TARGET Third_Party PROPERTY IMPORTED_IMPLIB path_to_thirdPartyLib/thirdParty.lib)
    
    target_link_libraries(myMainLib Third_Party)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用链接目录设置库的路径

    add_library(myMainLib STATIC ${BACKEND_SOURCES})
    
    set(LIB_DIR path_to_thirdPartyLib)
    
    LINK_DIRECTORIES(${LIB_DIR})
    
    target_link_libraries(myMainLib ${LIB_DIR}/thirdParty.lib)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 尝试找到图书馆

    add_library(myMainLib STATIC ${BACKEND_SOURCES})
    
    find_library(Third_Party thirdParty.lib)
    
    if(Third_Party)
      #never gets in here
      target_link_libraries(myMainLib ${Third_Party})
    endif()
    
    Run Code Online (Sandbox Code Playgroud)

Mar*_* A. 3

在 CMake 和一些构建系统中,直接将静态库链接到另一个静态库是没有意义的。您可以构建一个静态库和第二个静态库,并将可执行项目链接到这两个库,但不可能将第一个静态库与第二个库链接,然后将它们链接到最终的可执行文件中。尽管 VS 允许这样做,但它对于其他构建系统没有意义,因此 CMake 会避免这样做。

一些解决方案涉及使静态库成为共享库或将库源提取到可执行文件中。

其他细节请看这里