【问题标题】:CMake cannot link statically on Linux (perfectly works on Windows)CMake 无法在 Linux 上静态链接(在 Windows 上完美运行)
【发布时间】:2018-07-15 18:44:09
【问题描述】:

我确实有以下CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(testovnik)

include_directories(include)

file(GLOB SOURCES "src/*.cpp" "include/*.hpp")
file(GLOB TESTS "tests/*.cpp")

set(EXECUTABLE_NAME "testovnik")

add_executable(${EXECUTABLE_NAME} ${SOURCES})

if(WIN32)
    set(SFML_ROOT "C:/lib/SFML")
endif()

set_target_properties(${EXECUTABLE_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
set(SFML_STATIC_LIBRARIES TRUE)
find_package(SFML 2 REQUIRED graphics window system)
if(SFML_FOUND)
  include_directories(${SFML_INCLUDE_DIR})
  target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
endif()

当我在 Windows 上执行cmake 时,它运行良好。创建一个.sln,然后我可以构建整个项目并且它可以工作。现在我想在 Linux 上做同样的事情,必须静态链接它。但它不起作用。我收到以下错误:

[frynio@manjaro bin]$ cmake ..
CMake Error at /usr/share/cmake-3.10/Modules/FindSFML.cmake:355 (message):
  Could NOT find SFML (missing: SFML_GRAPHICS_LIBRARY SFML_WINDOW_LIBRARY
  SFML_SYSTEM_LIBRARY)
Call Stack (most recent call first):
  CMakeLists.txt:22 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/frynio/projects/cpp/testovnik_cpp/bin/CMakeFiles/CMakeOutput.log".

如果我评论/删除 set(SFML_STATIC_LIBRARIES TRUE) 行,那么它可以工作。我可以将其更改为set(SFML_STATIC TRUE),然后它也可以工作,make 也可以工作。但是,如果我创建项目,我会得到可执行文件,但如果我卸载 sfml (sudo pacman -R sfml),那么在尝试启动它时会出现以下错误:

[frynio@manjaro bin]$ ./testovnik
./testovnik: error while loading shared libraries: libsfml-graphics.so.2.4: cannot open shared object file: No such file or directory

有什么方法可以构建我的项目并将其提供给其他人而无需安装sfml

【问题讨论】:

  • 您确定在 Linux 机器上安装了静态 SFML 库吗?
  • 我没有。但是当我从sfml 下载站点(带有-s 的站点)复制它们时,它确实通过了,但它抛出了很多错误,说:relocation [...] cannot be used when making a shared object,它说我应该用-fPIC 编译(这不是完全有帮助)
  • 所以你的问题不是静态链接SFML,而是获取SFML静态库,不是吗?
  • 我想这是真的。但仍然无法解决这个问题
  • "但是它抛出了很多错误说:relocation [...] cannot be used when making a shared object 并且它说我应该用-fPIC 编译(这根本没有帮助)" - 它说你需要有 SFML 本身要使用 -fPIC 编译,以便能够与其链接。

标签: linux cmake static-libraries sfml static-linking


【解决方案1】:

假设您使用的是 Archlinux (pacman ?),您可以看到 sfml package 仅包含共享库...

您应该考虑从源代码构建 SFML 库以获取静态库...

ps:你也可以使用pacman -Ql sfml
Q:查询方式
l: 列出文件

【讨论】:

  • 是的,你是对的。如果我得到了源代码,那么我怎样才能让它也构建静态库呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多