2016-06-14 9 views
1

20160614:CMake не связывает glfw прямо под osx

У меня есть glfw, установленный MacPorts. sudo port install glfw И я проверил, что /opt/local/lib/libglfw.dylib существует.

Вот мой главный заголовок main.cpp:

#include <GLFW/glfw3.h> 

Мои CMakeLists.txt (file1):

cmake_minimum_required (VERSION 2.8) 
project (t1) 
include_directories(/opt/local/include) 
link_directories(/opt/local/lib) 
# find_library(MYGLFWLIB NAMES glfw HINTS /opt/local/lib NO_DEFAULT_PATH) 
set(GLLIBS GL glfw glew) 
add_executable(t1 main.cpp) 
target_link_libraries(t1 ${GLLIBS}) 

После cmake . && make, который никакой ошибки не сообщили, я выполняю по ./t1 Тогда Пришла ошибка:

dyld: Library not loaded: lib/libglfw.3.dylib 
Referenced from: /Users/...../t1 
Reason: image not found 
[1] 13949 trace trap ./t1 

Затем я использую otool -L t1 проверить Lib dependens в t1

/opt/local/lib/libGL.1.dylib (compatibility version 4.0.0, current version 4.0.0) 
lib/libglfw.3.dylib (compatibility version 3.0.0, current version 3.2.0) 
/opt/local/lib/libGLEW.1.13.0.dylib (compatibility version 1.13.0, current version 1.13.0) 
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) 

Может кто-нибудь сказать мне, почему glfw не связан правильно?

20160615:

После изменения моего CMakeLists.txt (file2):

cmake_minimum_required (VERSION 2.8) 

project (t1) 

include_directories(/opt/local/include) 
link_directories(/opt/local/lib) 

find_library(GL_LIB GL HINTS /opt/local/lib) 
find_library(GLFW_LIB glfw HINTS /opt/local/lib) 
find_library(GLEW_LIB glew HINTS /opt/local/lib) 

message(${GLFW_LIB}) 
message(${GLEW_LIB}) 
message(${GL_LIB}) 

add_executable(t1 main.cpp) 
target_link_libraries(t1 ${GL_LIB} ${GLFW_LIB} ${GLEW_LIB}) 

У меня есть два OSX устройства (MacMini и MacBookPro), версия MacPorts и Xcode и CMake и система все то же самое:

Mac OSX: 10.11.5 MacPorts 2.3.4 CMake: 3.5.2 Xcode: 7,3

Обе версии CMakeLists (file1 и file2 выше) работают в MacMini, компоновщик работает отлично. Но когда он ссылается на мой MacBookPro, glfw плохо связан.

Кто-то должен был столкнуться с почти такая же проблема:

macports-cmake-make-dyld-library-not-loaded

заинтересованная эта проблема системная переменная?

ответ

0
set(GLLIBS GL glfw glew) 

Это не то, как вы должны использовать CMake. Используйте find_library или

pkg_search_module(GLFW REQUIRED glfw3) 
include_directories(${GLFW_INCLUDE_DIRS}) 
target_link_libraries(simple ${GLFW_LIBRARIES}) 

Посмотрите в документации: http://www.glfw.org/docs/3.0/build.html

+0

Следуя вашему совету, я использую 'find_library' найти libglfw. путь dylib. 'find_library (GLFW_LIB glfw HINTS/opt/local/lib)'. By 'message ($ {GLFW_LIB})', cmake найти glfw lib, который находится в /opt/loca/lib/libglfw.dylib, но все же сгенерированный двоичный файл сообщает об ошибке: dyld: Библиотека не загружена: lib /libglfw.3.dylib – everding

+0

Используйте 'message' для печати значений' GLFW_LIBRARIES'. Возможно также удалить файл CMakeCache.txt. – usr1234567

+0

Был опробован метод удаления несвязанных файлов (CMakeCache.txt ...), ничего чуда не произошло. Под «сообщением» я вижу, что GLFW_LIB прав: /opt/local/lib/libglfw.3.dylib, но когда он идет в двоичном формате, что-то не так. Я действительно хочу знать, что делает различия. – everding

2

После поиска в течение нескольких часов, я нашел причину: glfw @3.2: install_name is not set properly

+1

Вы можете исправить это сейчас, используя 'sudo install_name_tool -id /opt/local/lib/libglfw.3.dylib/opt/local/lib/libglfw.3.dylib'. Это изменит имя установки библиотеки на правильное значение. – neverpanic

+0

Спасибо. Я знал, что install_name_tool может исправить значение, я просто хочу знать, как это происходит. В любом случае проблема решена. – everding