如何在 CMake 中链接预编译库?

Posted

技术标签:

【中文标题】如何在 CMake 中链接预编译库?【英文标题】:How do you link precompiled libraries in CMake? 【发布时间】:2021-06-08 13:31:38 【问题描述】:
# file(COPY $CMAKE_SOURCE_DIR/libs/glew32.lib DESTINATION $PROJECT_BINARY_DIR/libs)
# file(COPY $CMAKE_SOURCE_DIR/libs/libglfw3dll.a DESTINATION $PROJECT_BINARY_DIR/libs)

add_executable($PROJECT_NAME main.cpp)
# libs/glew32.lib
# libs/libglfw3dll.a
# "main.cpp"
# )

target_link_libraries($PROJECT_NAME
libs/glew32.lib
libs/libglfw3dll.a
)

我在这里尝试了所有选项,但最终导致链接错误。我尝试了从 src 编译和使用 glfw 和 glew 提供的所有可用格式。

【问题讨论】:

请显示minimal reproducible example,包括完整的错误消息 我相信这两个库都受 CMake 支持并且已经有了查找器。你可能想用 find_package() 代替这个。 我做了,但由于某种原因使用 find_package 时 emcmake 会中断 【参考方案1】:

我通常首先创建一个 CMake 目标来导入预构建/预编译的库,然后像您通常链接到 CMake 库目标一样使用target_link_libraries。好处是您可以将依赖项控制为 PRIVATE 依赖项或 PUBLIC 依赖项。

project(YourCoolProject)

# Import a prebuilt library to a CMake target
add_library(Foo SHARED IMPORTED)
set_target_properties(Foo PROPERTIES
  IMPORTED_LOCATION_DEBUG   "/absolute-path/to/prebuilt-debug-library"
  IMPORTED_LOCATION_RELEASE "/absolute-path/to/prebuilt-release-library"
  IMPORTED_LOCATION_RELWITHDEBINFO "/absolute-path/to/prebuilt-relwithdebinfo-library"
  INTERFACE_INCLUDE_DIRECTORIES "/absolute-path/to/include-dir"
)

add_executable($PROJECT_NAME main.cpp)
target_link_libraries($PROJECT_NAME PRIVATE Foo)

注意事项:

    IMPORTED_LOCATION_<CONFIG> 的选择取决于您提供给 CMake (cmake -DCMAKE_BUILD_TYPE=<CONFIG> ...) 的构建类型。 为了替换绝对路径,您可以使用find_library利用CMake查找您的库并将其存储在变量中,然后使用find_path查找包含目录。

【讨论】:

【参考方案2】:

您可能还需要使用target_link_directories() 来告诉编译器在哪里可以找到库:

target_link_directories($PROJECT_NAME $PROJECT_BINARY_DIR/libs/)

【讨论】:

以上是关于如何在 CMake 中链接预编译库?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 下通过 CMake 使用预编译的 HDF5 库

在 cmake 中使用预编译的 tensorflow

cmake 预编译

cmake 怎么配置才能生成预编译文件和汇编文件

使用预编译库PREBUILT LIBRARY

如何添加预编译静态库 libwebrtc