如何在VSCode中用CMake引入并链接.dylib文件(GLFW示例)
手动引入GLFW动态库的CMake配置问题
项目结构
main.cpp CMakeLists.txt build dependencies - glfw - lib - libglfw.3.dylib - include - glfw3.h - glfw3native.h
库文件来源
从GLFW官网下载macOS预编译二进制包,提取出头文件和.dylib文件后移入上述项目目录。
当前CMakeLists.txt内容
cmake_minimum_required(VERSION 3.27) project(demo) add_executable(demo main.cpp) include_directories(${CMAKE_SOURCE_DIR}/dependencies/glfw/include) link_directories(${CMAKE_SOURCE_DIR}/dependencies/glfw/lib) if (APPLE) target_link_libraries(demo PRIVATE "-framework OpenGL" ) endif() add_library(glfw SHARED IMPORTED) target_sources(glfw INTERFACE ${CMAKE_SOURCE_DIR}/dependencies/glfw/lib/libglfw.3.dylib) target_link_libraries(demo INTERFACE glfw) # set_target_properties(glfw PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/dependencies/glfw/lib/libglfw.3.dylib)
问题现象
在VSCode中执行CMake: Build时,编译器报告GLFW相关的未定义符号错误,明确是库链接方式有误,但不清楚具体问题出在哪里。
我对CMake相关指令的理解
include_directories:告知CMake头文件位置,已验证可用——main.cpp中能正常#include <glfw3.h>,且IntelliSense可以正常提示函数和类型。link_directories:告知CMake库文件的搜索路径,仅指定路径,不执行实际链接操作。add_library(<name> <type> IMPORTED):用于引用项目外部的库文件,创建一个名为<name>的CMake目标,使其在项目中可用(本例中库在项目目录内,我认为只需提供二进制文件的完整路径即可)。target_sources:指定构建目标所需的源文件,但GLFW是预编译二进制库,我不确定是否需要对它使用该指令,怀疑这里操作有误。我也曾尝试过使用注释掉的set_target_properties方式,但仍出现未定义符号错误。target_link_libraries:将GLFW目标链接到主项目目标,我认为这会告知链接器去链接GLFW目标,且已经指定了搜索路径和目标文件,理论上应该能正常工作。
之前可行的vcpkg配置
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake) set(CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/vcpkg/packages/glfw3_arm64-osx/share/glfw3 ${CMAKE_PREFIX_PATH}) find_package(glfw3 CONFIG REQUIRED) target_link_libraries(demo PRIVATE glfw) target_include_directories(demo PRIVATE ${CMAKE_SOURCE_DIR}/vcpkg/packages/glfw3_arm64-osx/include/GLFW)
该配置可以正常运行,但它链接的是静态库libglfw3.a,会增大可执行文件体积,我希望学习如何在运行时正确链接动态库。
我的疑问
我非常希望学好CMake,不想被其复杂性难住,请问我的方向是否正确?
内容的提问来源于stack exchange,提问作者michael.yql
相关产品推荐
相关产品推荐

