Undefined Symbols when linking a project to GLFW3 using CMake on OSX

I follow this guide on how to create a project using GLFW3 with CMake on OSX 10.9.1, and I ran into some trouble. When I get to creating the actual project, I get the following errors:

$ 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

My CMakeLists.txt looks like this:

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)

However, you can simply build a project using

cc `pkg-config --cflags glfw3` -o graphics graphics.cpp \
    `pkg-config --static --libs glfw3`
+3
source share
3 answers

Brett Hale is right in his comment.

References to undefined relate to obsolete functions and therefore do not relate to the OpenGL kernel profile.

The best solution is to remove links to obsolete functions and replace them with functions only from the main profile.

0
source

, 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 , , .

+1

I had to do it.

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")

Note that I use "glfw3" instead of $ {GLFW_STATIC_LIBRARIES} in target_link_library. It didn’t work for me otherwise.

I am using cmake 3.6.1.

0
source

All Articles