CMake如何链接动态库/静态库。

8
我的 CMake 输出的是一个静态库。我是这样创建它的:
add_library(myMainLib STATIC ${BACKEND_SOURCES})

当我试图让myMainLib与第三方lib/dll链接时,出现了问题。dll文件在运行时可以找到,但是我尝试导入/链接lib文件时却没有成功。我的第三方库是SDL2和SDL2 NET。
我认为这很简单,并且已经尝试了所有在网上找到的方法,但都失败了。下面是我尝试过的方法列表,请告诉我我做错了什么。
  1. Simple method, using target_link_libraries

    add_library(myMainLib STATIC ${BACKEND_SOURCES})
    
    target_link_libraries(myMainLib path_to_thirdPartyLib/thirdParty.lib)
    
  2. According to 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)
    
  3. Set path to library using link directories

    add_library(myMainLib STATIC ${BACKEND_SOURCES})
    
    set(LIB_DIR path_to_thirdPartyLib)
    
    LINK_DIRECTORIES(${LIB_DIR})
    
    target_link_libraries(myMainLib ${LIB_DIR}/thirdParty.lib)
    
  4. Try finding the library

    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()
    
1个回答

3
在CMake和一些构建系统中,将一个静态库直接链接到另一个静态库是没有意义的。你可以构建一个静态库和第二个静态库,并让你的可执行项目链接到两者,但是不可能将第一个静态库与第二个库链接,然后将它们链接到最终的可执行文件中。虽然VS允许这样做,但对于其他构建系统来说没有意义,因此CMake会避免这样做。
一些解决方案包括将你的静态库变成共享库或将库源代码拉入可执行文件中。
更多详情请参见这里

将第三方 DLL 链接到 QT 可执行前端。 - Marco A.
谢谢提供链接,我现在更好地理解了问题。 - h_b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接