使用 CMake 构建和添加多个库 [重复]

Building and adding several libraries with CMake [duplicate]

提问人:GrandJagon 提问时间:2/15/2023 最后编辑:GrandJagon 更新时间:2/15/2023 访问量:113

问:

我是 CMake 新手,并试图在我的项目中使用它来学习它

该项目是一个小型游戏引擎,使用不同的外部库,如 GLFW、GLUT 和 SDL2。其中一些(例如 GL)位于我的 os include 目录中,而其中一些(例如 SDL)位于我的源代码树 (/vendors/SDL2) 中。

我正在尝试构建 SDL2 库,该库是一些头文件并将其链接到我的项目。

经过一番研究,我发现应该使用INTERFACE关键字,这就是我尝试的方式:

add_library(SDL2 INTERFACE)
target_include_directories(SDL2 INTERFACE vendors/SDL2)

在我的CMakeLists的末尾:

target_link_libraries(engine INTERFACE SDL2)

但是我遇到的问题是,我还有其他以传统方式构建的库(不使用interface关键字):

find_package(OpenGL REQUIRED)
find_package(glfw3 REQUIRED)
find_package(GLUT REQUIRED)
find_package(GLEW REQUIRED)

set(LIBS_DIR ${OPENGL_INCLUDE_DIRS} ${GLFW_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS})

set(LIBS ${OPENGL_LIBRARIES} ${GLFW_LIBRARIES} ${GLUT_LIBRARIES} ${GLEW_LIBRARIES} SDL2 STB_IMAGE)

target_include_directories(
    engine PUBLIC
    ${LIBS_DIR}
)

target_link_libraries(engine  ${LIBS})


这样做,我最终会得到以下错误,我将其解释为每个项目只应使用target_link_libraries。

The plain signature for target_link_libraries has already been used with the target "engine". All uses of target_link_libraries with a target must be either all-keyword or all-plain.

我的问题是:如何将两种类型的库链接到我的项目?

我构建 SDL2 库的方式是否正确?我在网上看到过其他方法,但这个对我来说似乎是最简单的方法

多谢!

我还尝试将 SDL2 库添加到我的 LIBS 值中:

set(LIBS ${OPENGL_LIBRARIES} ${GLFW_LIBRARIES} ${GLUT_LIBRARIES} ${GLEW_LIBRARIES} SDL2 STB_IMAGE)

并在不使用关键字 INTERFACE 的情况下以正常方式链接它,但我收到未定义的引用链接器错误。事实上,我的引擎从 SDL2 库使用的方法似乎没有定义,所以我猜库没有正确排列。

C++ CMake 链接器 仅标头

评论

0赞 user7860670 2/15/2023
如果你的项目是一个只有标题的库,那么你不能将任何内容链接到它。
0赞 GrandJagon 2/15/2023
谢谢!我的项目不仅仅是标题,我正在使用的库是
0赞 Tsyvarev 2/15/2023
“事实上,我的引擎从 SDL2 库使用的方法似乎是未定义的”——这并不奇怪,因为您没有指定定义这些方法的库文件。INTERFACE 库适用于仅标头库,但 SDL2 属于其他类型。Stack Overflow 上有很多关于将 SDL2 与 CMake 一起使用的问题。为什么不关注他们?例如那个
0赞 drescherjm 2/15/2023
我不认为 SDL2 只是标题。

答: 暂无答案