gpt4 book ai didi

c++ - 在 Windows 上链接外部库 CMakeLists.txt

转载 作者:行者123 更新时间:2023-11-28 01:38:53 27 4
gpt4 key购买 nike

我正在尝试实现一个 CMakeLists.txt 来在 Linux 和 Windows 下编译我的项目。我使用两个库:SFML 和 boost。但是,我希望我的项目可以在 Linux 或 Windows 下构建,而无需用户安装库。

我解释一下。库 SFML 和 boost 已编译并放置在我的文件夹项目中,我希望无论我在哪台计算机上下载我的项目,我都可以构建它。

这是我的问题,我无法从我的文件夹项目、SFML 和 boost 库中的库文件夹进行外部链接。

这是我的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.0)

project(r-type_client CXX)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")

include_directories(./boost/include
./SFML/include
./include
)

if(UNIX)

set(BOOST_LIBRARY
-L./boost/linux
-lboost_regex
)

set(SFML_LIBRARY
-L./SFML/linux
-lsfml-graphics
-lsfml-window
-lsfml-system
)

add_executable(r-type_client
srcs/Main.cpp
)

target_link_libraries(r-type_client
${BOOST_LIBRARY}
${SFML_LIBRARY}
)

elseif(WIN32)

add_library(bar SHARED IMPORTED)
set_property(TARGET bar PROPERTY IMPORTED_LOCATION
C:/Users/Hugo/Downloads/Old/client/SFML/windows/sfml-graphics.dll)
set_property(TARGET bar PROPERTY IMPORTED_IMPLIB
C:/Users/Hugo/Downloads/Old/client/SFML/windows/sfml-graphics.lib)
add_library(bor SHARED IMPORTED)
set_property(TARGET bor PROPERTY IMPORTED_LOCATION
C:/Users/Hugo/Downloads/Old/client/SFML/windows/sfml-window.dll)
set_property(TARGET bor PROPERTY IMPORTED_IMPLIB
C:/Users/Hugo/Downloads/Old/client/SFML/windows/sfml-window.lib)
add_library(bur SHARED IMPORTED)
set_property(TARGET bur PROPERTY IMPORTED_LOCATION
C:/Users/Hugo/Downloads/Old/client/SFML/windows/sfml-system.dll)
set_property(TARGET bur PROPERTY IMPORTED_IMPLIB
C:/Users/Hugo/Downloads/Old/client/SFML/windows/sfml-system.lib)
add_executable(r-type_client srcs/Main.cpp)
target_link_libraries(r-type_client bar bor bur)

endif(UNIX)

最佳答案

正如我在评论中提到的,您应该使用 find_package() 以正确的方式设置您的 CMake 项目以正确定位所有内容。

CMake 是一种工具,无论主机系统如何,人们都可以创建动态编译所需的文件。通过对路径和(不需要的)每个平台分支进行硬编码,您基本上否定了 CMake 的全部目的。

要在 CMake 中包含第三方库,您通常需要使用 find_package(),它包括必要的逻辑来正确定位库和设置变量(它基本上完成您的操作到目前为止都是手工完成的)。

让我们为 SFML 做这件事,因为它与 Boost 基本相同(我并没有真正让 Boost 准备好测试所有东西,因为变量名称可能因项目而异)。

首先,您将告诉 CMake 您的项目想要使用 SFML:

find_package(SFML)

根据实际的“包”,你可以扩展它。在 SFML 的情况下,我们甚至可以定义我们想要的最低版本以及我们实际想要使用的子库:

find_package(SFML 2.3 COMPONENTS graphics window system REQUIRED)

REQUIRED 标志使整个事情成为强制性的,即如果找不到,CMake 将出错。

一旦此行成功,它将设置一些具有正确路径和库的变量,然后我们可以在定义目标时使用它们:

include_directories(${SFML_INCLUDE_DIR})
add_executable(myprogram ${MY_SOURCE_FILES})
target_link_libraries(myprogram ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})

你就完成了。如您所见,我可以在不到 10 行的时间内设置一个 CMake 项目,而无需任何特定于平台的路径、代码或知识。

但是,运行此程序时,您很可能会遇到一个错误:

默认情况下,CMake 可能无法找到 FindSFML.cmake 文件并提示。

您将在 cmake 路径下的 SFML 目录中找到此文件。将其复制到您的项目并告诉 CMake 在哪里查找它,例如:

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")

同样完成此操作后,CMake 可能无法找到实际的 SFML 文件,尤其是在 Windows 上。要告诉它在哪里寻找它,您可以在调用 CMake 时定义 SFML_ROOT:

cmake -DSFML_ROOT=C:/Users/Hugo/Downloads/Old/client/SFML path/to/source

这为您提供了一个很大的优势,即您不必对 SFML(或任何其他库,例如 Boost)的路径进行硬编码。在您的 Linux 机器上,您通常甚至不需要提供任何路径,一切都应该开箱即用。

关于c++ - 在 Windows 上链接外部库 CMakeLists.txt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48187111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com