【问题标题】:How to link libraries containing lib and include folders in cmake on windows如何在 Windows 上的 cmake 中链接包含 lib 和包含文件夹的库
【发布时间】:2021-03-04 08:27:33
【问题描述】:

这是我的基本文件结构:

├── BUILD
│   └── lib
│       └── *.a files
│   └── include
│       └── library
├── test.cpp
└── CmakeLists.txt

我正在尝试将包含和 lib 文件夹文件链接到 test.cpp。这是我当前的 CmakeLists.txt 文件:

cmake_minimum_required(VERSION 3.10)
project(test)

set(CMAKE_CXX_STANDARD 14)

add_executable(test test.cpp)

target_include_directories(test PUBLIC ${CMAKE_SOURCE_DIR}/BUILD/include)

target_link_libraries(test not-sure-what-to-put-here)

我知道我的target_include_directories 行正在工作,但是无论我为target_link_libraries 输入什么,它似乎总是失败并给出错误:

undefined reference to `_imp___ZN2sf6StringC1EPKcRKSt6locale'
undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
undefined reference to `_imp___ZN2sf12RenderWindowC1ENS_9VideoModeERKNS_6StringEjRKNS_15ContextSettingsE'
undefined reference to `_imp___ZN2sf12RenderWindowD1Ev'

我希望就我的 CMakeLists.txt 文件的问题得到帮助,谢谢!

编辑 1,这是针对静态链接库的

【问题讨论】:

  • 那么我需要在 lib 文件夹中包含每个 .a 文件吗?
  • 那么我需要在 lib 文件夹中包含每个 .a 文件吗? 不是具有查找器模块且受 CMake 支持的库.我不知道你的 .a 文件是干什么用的。如果它们是 SFML,则其得到很好的支持。我的第一个链接描述了正确的方法。
  • "这可能是你想要的,因为你标记了 sfml:github.com/SFML/SFML/wiki/…" 遗憾的是,该教程已经过时了
  • 对不起,请点击论坛帖子的链接以获得更好的解决方案:https://en.sfml-dev.org/forums/index.php?topic=24070.0

标签: c++ makefile cmake linker sfml


【解决方案1】:

您使用 sfml 标签标记了您的问题,因此您获得了 cmets 和有关此库的答案。但是,您的问题似乎只是关于您想要链接到可执行文件的一些静态库。这应该有效:

cmake_minimum_required(VERSION 3.10)
project(test)

set(CMAKE_CXX_STANDARD 14)

add_executable(test test.cpp)

target_include_directories(test PUBLIC ${CMAKE_SOURCE_DIR}/BUILD/include)

target_link_libraries(test ${CMAKE_SOURCE_DIR}/BUILD/lib/libA.a ${CMAKE_SOURCE_DIR}/BUILD/lib/libB.a)

所以,是的 - 您需要在 target_link_libraries 命令中列出所有库。

【讨论】:

    【解决方案2】:

    如果您使用的是动态/共享 SFML,请使用它。

    cmake_minimum_required(VERSION 3.10)
    project(test)
    
    set(CMAKE_CXX_STANDARD 14)
    
    target_include_directories(test PUBLIC ${CMAKE_SOURCE_DIR}/BUILD/include)
    
    add_library(sfml-graphics shared IMPORTED)
    set_property(TARGET sfml-graphics PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILDv/lib/libsfml-graphics.so)
    add_library(sfml-window shared IMPORTED)
    set_property(TARGET sfml-window PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-window.so)
    add_library(sfml-audio shared IMPORTED)
    set_property(TARGET sfml-audio PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-audio.so)
    add_library(sfml-network shared IMPORTED)
    set_property(TARGET sfml-network PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-network.so)
    add_library(sfml-system shared IMPORTED)
    set_property(TARGET sfml-system PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-system.so)
    
    add_executable(test test.cpp)
    
    
    target_link_libraries(test sfml-graphics sfml-window sfml-audio sfml-network sfml-system)
    

    如果您使用的是 sfml 的静态版本,请使用它。

    cmake_minimum_required(VERSION 3.10)
    project(test)
    
    set(CMAKE_CXX_STANDARD 14)
    
    target_include_directories(test PUBLIC ${CMAKE_SOURCE_DIR}/BUILD/include)
    
    add_library(sfml-graphics-s shared IMPORTED)
    set_property(TARGET sfml-graphics-s PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILDv/lib/libsfml-graphics-s.a)
    add_library(sfml-window-s shared IMPORTED)
    set_property(TARGET sfml-window-s PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-window-s.a)
    add_library(sfml-audio-s shared IMPORTED)
    set_property(TARGET sfml-audio-s PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-audio-s.a)
    add_library(sfml-network-s shared IMPORTED)
    set_property(TARGET sfml-network-s PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-network-s.a)
    add_library(sfml-system-s shared IMPORTED)
    set_property(TARGET sfml-system-s PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/BUILD/lib/libsfml-system-s.a)
    
    add_executable(test test.cpp)
    
    target_link_libraries(test sfml-graphics-s sfml-window-s sfml-audio-s sfml-network-s sfml-system-s freetype X11 Xrandr pthread GL GLU udev FLAC ogg vorbis vorbisenc vorbisfile openal)
    

    这应该绝对有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多