linux - CMake 无法在 Linux 上静态链接(在 Windows 上完美运行)

标签 linux cmake static-libraries sfml static-linking

我确实有以下 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

最佳答案

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

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

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

关于linux - CMake 无法在 Linux 上静态链接(在 Windows 上完美运行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48630557/

相关文章:

c++ - 更改静态库的包含路径

linux - 内存映射 i/0 在 linux 中工作

c++ - 如何在 Ubuntu 中使 TensorFlow-lite 可用于整个系统

python - 如何打开 "root"文件而无需每次都输入密码?

cmake - 编译具有相同目标的不同子项目时出现 CMP0002 错误

c++ - 将 C 和 C++ 与 CMAKE 混合

c++ - dlopen 从静态库中打开动态库,当动态库使用静态库的符号时

visual-studio - 有没有办法确定使用哪个版本的Visual Studio编译静态库?

linux - ARM Cortex A7 在内核模式下返回 PMCCNTR = 0,在用户模式下返回非法指令(即使在 PMUSERENR = 1 之后)

linux - Linux 内置服务的源代码在哪里?