构建 C++ 静态库时,什么原因导致隐藏在源文件中的第三方库成为最终用户依赖项?

When building a C++ static library what causes third party libraries hidden in source files to become end user dependencies?

提问人:Jack Benson 提问时间:12/20/2022 更新时间:12/20/2022 访问量:240

问:

对不起,如果这个问题有点啰嗦。我知道这里已经覆盖了很多领域。

本质上,当我将我的 tst_engine.lib 包含在另一个目标中时,我收到以下错误。

lld-link: error: undefined symbol: SDL_Init
>>> referenced by C:\Users\n10255460\CLionProjects\2D_engine_and_game\tst_engine\TstGameEngine.cpp:22
>>>               tst_engine.lib(TstGameEngine.cpp.obj):(public: __cdecl tst::TstGameEngine::TstGameEngine(bool *))

lld-link: error: undefined symbol: SDL_Quit
>>> referenced by C:\Users\n10255460\CLionProjects\2D_engine_and_game\tst_engine\TstGameEngine.cpp:43
>>>               tst_engine.lib(TstGameEngine.cpp.obj):(public: __cdecl tst::TstGameEngine::~TstGameEngine(void))
ninja: build stopped: subcommand failed.

如上所述,SDL 用于 .cpp 文件而不是 .h 文件。最重要的是,当我尝试将 SDL 作为依赖项包含在我尝试将 tst_engine 作为库进行编译的目标中时,此错误就会消失。

据我之前的理解,如果第三方库位于源文件中,则它永远不应该成为使用与源文件关联的库的人的依赖项。以下是两个相关的 cmake 文件:

触发错误的可执行文件:

cmake_minimum_required(VERSION 3.24)
project(game)

set(CMAKE_CXX_STANDARD 20)

include_directories(../tst_engine)

set(lib ${CMAKE_SOURCE_DIR}\\libraries\\lib)

include_directories(${CMAKE_SOURCE_DIR}\\libraries\\include)

add_executable(game main.cpp)
target_link_libraries(game
        ${CMAKE_SOURCE_DIR}\\cmake-build-debug\\tst_engine\\tst_engine.lib
)

编译成功的库:

cmake_minimum_required(VERSION 3.24)
project(tst_engine)

set(CMAKE_CXX_STANDARD 20)

set(lib ${CMAKE_SOURCE_DIR}\\libraries\\lib)

include_directories(${CMAKE_SOURCE_DIR}\\libraries\\include)

add_library(tst_engine STATIC TstGameEngine.h TstGameEngine.cpp)
target_link_libraries(tst_engine PRIVATE ${lib}\\SDL2main.lib ${lib}\\SDL2.lib ${lib}\\SDL2-static.lib)
C++ cmake 静态库 链接器错误

评论

1赞 Botje 12/20/2022
Cmake 不会以任何方式将 SDL “包含”到静态库中。看到这个可能的dup
2赞 Krzysiek Karbowiak 12/20/2022
一个静态库不与它所依赖的另一个静态库链接。相反,最终目标需要链接所有依赖项。你可以告诉 CMake 通过在 lib 的 .PRIVATEPUBLICtarget_link_libraries
0赞 drescherjm 12/20/2022
这可能会有所帮助: https://stackoverflow.com/questions/37924383/combining-several-static-libraries-into-one-using-cmake
0赞 Sandburg 12/20/2022
值得一提的是,CMake 文件中的路径可以用 Posix 样式(没有 \\)编写,并且比特定或 ...> 3.13 被称为“更现代的 CMake”。target_compile_features(tst_engine PUBLIC cxx_std_20)target_link_directoriestarget_include_directoriesset()include_directories

答: 暂无答案