Не удается найти библиотеку GLFW в macOS (Bazel)

#c #bazel #glfw

#c #bazel #glfw

Вопрос:

Я работаю над простым приложением OpenGL, используя C , Bazel и GLFW. Когда я пытаюсь создать правило для своего приложения, я получаю следующее сообщение об ошибке:

 ld: library not found for -lglfw3
 

Моя среда:

  • macOS Catalina 10.15.7
  • Версия Apple clang 12.0.0

Вот мое BUILD правило для цели:

 cc_binary(
    name = "hello-glfw",
    srcs = ["hello-glfw.cpp"],
    deps = [
        "@glfw//:glfw",
    ],
)
 

Я пытаюсь создать GLFW как внешнюю зависимость. В моем WORKSPACE файле есть это:

 http_archive(
    name = "glfw",
    build_file = "@//extern:glfw.BUILD",
    strip_prefix = "glfw-3.3.2",
    urls = ["https://github.com/glfw/glfw/archive/3.3.2.zip"],
)
 

Содержимое моего glfw.BUILD файла:

 DARWIN_DEFINES = [
    "_GLFW_COCOA",
    "_GLFW_NSGL",
    "_GLFW_NO_DLOAD_WINMM",
    "_GLFW_USE_OPENGL",
]

DARWIN_HDRS = [
    "src/cocoa_joystick.h",
    "src/cocoa_platform.h",
    "src/glx_context.h",
    "src/nsgl_context.h",
    "src/null_joystick.h",
    "src/null_platform.h",
    "src/posix_thread.h",
    "src/wl_platform.h",
]


DARWIN_SRCS = [
    "src/cocoa_time.c",
    "src/posix_thread.c",
]

DARWIN_LINKOPTS = [
    "-lglfw3",
    "-framework OpenGL",
    "-framework Cocoa",
    "-framework IOKit",
    "-framework CoreFoundation"
]


cc_library(
    name = "glfw_src",
    hdrs = [
        "include/GLFW/glfw3.h",
        "include/GLFW/glfw3native.h",
        "src/egl_context.h",
        "src/internal.h",
        "src/osmesa_context.h",
        "src/mappings.h",
        "src/xkb_unicode.h",
    ]   select({
        "@bazel_tools//src/conditions:windows": WIN32_HDRS,
        "@bazel_tools//src/conditions:linux_x86_64": LINUX_HDRS,
        "@bazel_tools//src/conditions:darwin": DARWIN_HDRS,
    }),
    srcs = [
        "src/context.c",
        "src/egl_context.c",
        "src/init.c",
        "src/input.c",
        "src/osmesa_context.c",
        "src/monitor.c",
        "src/vulkan.c",
        "src/window.c",
        "src/xkb_unicode.c",
    ]   select({
        "@bazel_tools//src/conditions:windows": WIN32_SRCS,
        "@bazel_tools//src/conditions:linux_x86_64": LINUX_SRCS,
        "@bazel_tools//src/conditions:darwin": DARWIN_SRCS,
    }),
    defines = select({
        "@bazel_tools//src/conditions:windows": WIN32_DEFINES,
        "@bazel_tools//src/conditions:linux_x86_64": LINUX_DEFINES,
        "@bazel_tools//src/conditions:darwin": DARWIN_DEFINES,
    }),
)

cc_library(
    name = "glfw",
    hdrs = [
        "include/GLFW/glfw3.h",
        "include/GLFW/glfw3native.h",
    ],
    linkopts = select({
        "@bazel_tools//src/conditions:windows": WIN32_LINKOPTS,
        "@bazel_tools//src/conditions:linux_x86_64": LINUX_LINKOPTS,
        "@bazel_tools//src/conditions:darwin": DARWIN_LINKOPTS,
    }),
    deps = [":glfw_src"],
    strip_include_prefix = "include",
    visibility = ["//visibility:public"],
)
 

Ответ №1:

Я столкнулся с той же проблемой на Mac. Правила Bazel, которые я нашел для GLFW, не работали для меня в Mac OS, поэтому я решил их переписать. После нескольких ошибок компоновки мне удалось заставить ее полностью работать, и я сообщил о своих результатах здесь. Я полагаю, вам уже удалось решить вашу проблему, но я надеюсь, что это полезно для всех, кто сталкивается с этой проблемой.

Ответ №2:

Я думаю, вам просто нужно удалить -lglfw3 из блока кода:

 DARWIN_LINKOPTS = [
    "-lglfw3",
    "-framework OpenGL",
    "-framework Cocoa",
    "-framework IOKit",
    "-framework CoreFoundation"
]
 

итак, он гласит:

 DARWIN_LINKOPTS = [
    "-framework OpenGL",
    "-framework Cocoa",
    "-framework IOKit",
    "-framework CoreFoundation"
]
 

Запрос ссылки glfw3, вероятно, является ошибкой вырезания и вставки из инструкций по сборке с использованием glfw, который предварительно собран.

Комментарии:

1. Спасибо за ответ! Теперь я вижу новую ошибку: неопределенные символы для архитектуры x86_64: «__glfwLoadLocalVulkanLoaderNS», ссылка из: __glfwInitVulkan в libglfw_src.a (vulkan_5e8a7b500a6a55500f41cfc8f7e8adf4.o) [и т.д. и т.п.]

2. Вероятно, вам не хватает исходного файла из glfw в списке источников.