Неопределенные символы при связывании проекта с GLFW3 с использованием CMake в OSX

Я следую этому руководству о том, как создать проект с использованием GLFW3 и CMake. на OSX 10.9.1, и я столкнулся с некоторыми проблемами. Когда я приступаю к созданию фактического проекта, я получаю следующие ошибки:

$ make
Scanning dependencies of target Graphics
[100%] Building CXX object CMakeFiles/Graphics.dir/graphics.cpp.o
Linking CXX executable Graphics
Undefined symbols for architecture x86_64:
  "_glBegin", referenced from:
      _main in graphics.cpp.o
  "_glClear", referenced from:
      _main in graphics.cpp.o
  "_glColor3f", referenced from:
      _main in graphics.cpp.o
  "_glEnd", referenced from:
      _main in graphics.cpp.o
  "_glLoadIdentity", referenced from:
      _main in graphics.cpp.o
  "_glMatrixMode", referenced from:
      _main in graphics.cpp.o
  "_glOrtho", referenced from:
      _main in graphics.cpp.o
  "_glRotatef", referenced from:
      _main in graphics.cpp.o
  "_glVertex3f", referenced from:
      _main in graphics.cpp.o
  "_glViewport", referenced from:
      _main in graphics.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [Graphics] Error 1
make[1]: *** [CMakeFiles/Graphics.dir/all] Error 2
make: *** [all] Error 2

Мой CMakeLists.txt выглядит так:

cmake_minimum_required (VERSION 2.8)
project (Graphics)

# The version number.
set (Graphics_VERSION_MAJOR 1)
set (Graphics_VERSION_MINOR 0)

# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
  "${PROJECT_SOURCE_DIR}/GraphicsConfig.h.in"
  "${PROJECT_BINARY_DIR}/GraphicsConfig.h"
  )

# add the binary tree to the search path for include files
# so that we will find GraphicsConfig.h
include_directories("${PROJECT_BINARY_DIR}")

find_package(PkgConfig REQUIRED)
pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS})

# add the executable
add_executable (Graphics graphics.cpp)
target_link_libraries(Graphics ${GLFW_STATIC_LIBRARIES})

# add the install targets
install (TARGETS Graphics DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/GraphicsConfig.h"        
         DESTINATION include)

Однако можно построить проект просто отлично, используя

cc `pkg-config --cflags glfw3` -o graphics graphics.cpp \
    `pkg-config --static --libs glfw3`

person jellymann    schedule 19.02.2014    source источник
comment
Это не основные функции профиля. Вам нужно будет запросить создание _FORWARD_COMPAT = GL_FALSE и _PROFILE = _COMPAT_PROFILE в контексте. А еще лучше — обновить код до основных функций профиля и шейдеров, когда они будут готовы.   -  person Brett Hale    schedule 21.02.2014


Ответы (3)


Я не могу предложить вам объяснение, почему одна ссылка связана с библиотеками OpenGL, а другая — нет, но следующее решение сработало для меня с аналогичной проблемой в OSX (Mountain Lion).

В конце блока «Добавить исполняемый файл» добавьте специфичное для Apple условие для связи с инфраструктурой OpenGL:

# add the executable
add_executable (Graphics graphics.cpp)
target_link_libraries(Graphics ${GLFW_STATIC_LIBRARIES})

if (APPLE)
  target_link_libraries(Graphics "-framework OpenGL")
endif()

Я подумал, что в конфигурации GLFW CMake должно быть что-то, отвечающее за связь с библиотеками OpenGL, поэтому я взглянул на GLFW 3.0.4 CMakeLists.txt и обнаружил строку "-framework".

Это поможет вам только в OSX - вам нужно будет предоставить другие способы связывания, специфичные для платформы, чтобы сделать его кроссплатформенным.

Возможно, вы уже обдумывали это, но в том же руководстве также содержится способ включения GLFW исходный код с вашим приложением и создайте его таким образом. Вероятно, это самый простой способ гарантировать кроссплатформенную совместимость.

person Andy Stanton    schedule 19.04.2014

Я должен был сделать это.

elseif(APPLE)
  # GLFW
  find_package(glfw3 REQUIRED)
  include_directories(${GLFW_INCLUDE_DIRS})

  find_package(GLEW REQUIRED)
  include_directories(${GLEW_INCLUDE_DIRS})

  # app_framework executable
  add_executable(app_framework ${SOURCE_FILES})
  target_link_libraries(app_framework app_framework_library ${GLEW_LIBRARY} glfw3)
  target_link_libraries(app_framework "-framework OpenGL")

Обратите внимание, что я использую "glfw3" вместо ${GLFW_STATIC_LIBRARIES} в target_link_library. В противном случае у меня не сработало.

Я использую cmake 3.6.1.

person Robert Sjödahl    schedule 31.08.2016

Бретт Хейл прав в своем комментарии.

Рассматриваемые неопределенные ссылки относятся к устаревшим функциям и, следовательно, не входят в основной профиль OpenGL.

Лучшее решение — удалить ссылки на устаревшие функции и заменить их функциями только из основного профиля.

person jellymann    schedule 07.07.2014
comment
Это не относится ко всем функциям, которые указаны как неопределенные. glClear и glViewport находятся в основном профиле. Так что это не может быть единственная проблема, с которой сталкивается ОП. - person Reto Koradi; 07.07.2014