【问题标题】:Linking SFML static libs to project将 SFML 静态库链接到项目
【发布时间】:2016-10-19 08:44:12
【问题描述】:

早上好!我正在从共享的 SFML 库转移到静态库。但我有很多错误:g++ 找不到一些库。我使用了本教程:https://github.com/SFML/SFML/wiki/Tutorial%3A-Build-your-SFML-project-with-CMake。我的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(LastFail)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/libs/)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/libs/)
set(CMAKE_C_COMPILER_INIT g++)

add_definitions(-std=c++1y -w)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
find_package(SFML 2 REQUIRED system window graphics network audio)

include_directories(
    include/
    libs/include/
)

file(GLOB SRC
    "src/*/*.cpp"
    "src/*.cpp"
)

add_executable(LastFail ${SRC})

target_link_libraries(LastFail
    ${CMAKE_SOURCE_DIR}/libs/libjsoncpp.a
    ${CMAKE_SOURCE_DIR}/libs/libsfml-audio-s.a
    ${CMAKE_SOURCE_DIR}/libs/libsfml-graphics-s.a
    ${CMAKE_SOURCE_DIR}/libs/libsfml-network-s.a
    ${CMAKE_SOURCE_DIR}/libs/libsfml-system-s.a
    ${CMAKE_SOURCE_DIR}/libs/libsfml-window-s.a
)

set_target_properties(LastFail PROPERTIES
    OUTPUT_NAME "LastFail"
    CLEAN_DIRECT_OUTPUT 1
)

我的一小部分错误:

JoystickImpl.cpp:(.text+0x1166): 未定义对“udev_device_get_syspath”的引用 libs/libsfml-window-s.a(JoystickImpl.cpp.o):在函数'sf::priv::JoystickImpl::open(unsigned int)'中: JoystickImpl.cpp:(.text+0x19ed): undefined reference to 'udev_device_new_from_syspath'

我该如何解决这个问题?我需要做那种跨平台的方式。谢谢!

编辑:

当然,我有一个名为 libs 的目录,其中包含所有需要的库。

【问题讨论】:

  • ` undefined reference to 'udev_device_get_syspath` 意味着您没有链接定义该函数的库。是libudev
  • @MikeKinghan,谢谢!但是你知道,有很多遗漏的库。我需要一种 cmake 脚本来链接它们……而且它必须是跨平台的。如果您想查看所有错误,我已将它们全部粘贴:pastebin.com/erfnieXC
  • And it must be cross-platform. - 如果您有项目附带的库,这意味着什么?您想为您的项目提供所有可能的平台的所有库吗?要不然是啥?实际上什么是问题/问题?
  • 我想在我的项目中使用 SFML 和 json-cpp,这样每个人都可以从盒子里得到它。但是如何用 cmake 做到这一点?
  • 我需要为 sfml 链接所有需要的库,如果它是 linux 的话。

标签: c++ linker cmake sfml


【解决方案1】:

首先,将所有依赖项与项目本身打包通常不是一个好主意,但对于类似游戏的应用程序可能会有例外。

在您的情况下,问题不在于打包的 SFML,而在于 libudev 库。这个库是

  1. Linux 特定(非跨平台)

  2. 不能静态链接(嗯,它可能可以,但我敢打赌这是一个非常糟糕的主意,因为您链接的库可能与在主机上运行的 udev 守护程序的版本不同)

因此,无论如何,您都需要将udev 添加到您的target_link_libraries()

【讨论】:

  • 我需要一种 cmake 脚本来链接 所有 依赖项/我自己做不到。
  • 这个“脚本”基本上列出了target_link_libraries()调用中的所有依赖项。
  • 你能帮帮我吗?我实际上对 cmake 文件一无所知。
  • 找出你所依赖的所有库的名称(如udev)并将这一行添加到你的CMakeLists.txt:target_link_libraries(LastFail udev other_lib1 other_lib2 ...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2011-09-01
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多