如何在 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 中链接预编译库?的主要内容,如果未能解决你的问题,请参考以下文章