【问题标题】:CMake does not link glfw right under osxCMake 没有在 osx 下直接链接 glfw
【发布时间】:2016-10-14 13:11:11
【问题描述】:

20160614:

我已经通过 MacPorts 安装了 glfw。 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 . &amp;&amp; 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 来检查 t1 中的 lib 依赖项

/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 和 System 的版本都是一样的:

Mac 操作系统:10.11.5 MacPorts 2.3.4 CMake:3.5.2 Xcode:7.3

CMakeLists 的两个版本(上面的文件 1 和文件 2)在 MacMini 中工作,链接器工作正常。 但是当谈到我的 MacBookPro 时,glfw 并没有很好地连接。

其他人也遇到了几乎相同的问题:

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

这个问题与系统变量有关吗?

【问题讨论】:

    标签: cmake macports glfw


    【解决方案1】:

    搜索了几个小时,我找到了原因:glfw @3.2: install_name is not set properly

    【讨论】:

    • 您现在可以使用sudo install_name_tool -id /opt/local/lib/libglfw.3.dylib /opt/local/lib/libglfw.3.dylib 修复此问题。这会将库的安装名称更改为正确的值。
    • 谢谢。我知道 install_name_tool 可以更正值,我只想知道这是怎么发生的。反正问题已经解决了。
    【解决方案2】:
    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

    【讨论】:

    • 按照您的建议,我使用find_library 查找 libglfw.dylib 路径。 find_library(GLFW_LIB glfw HINTS /opt/local/lib)。通过message(${GLFW_LIB}),cmake 找到了位于 /opt/loca/lib/libglfw.dylib 的glfw lib,但是生成的二进制文件仍然报错:dyld: Library not loaded: lib/libglfw.3.dylib
    • 使用message 打印GLFW_LIBRARIES 的值。也许还删除 CMakeCache.txt 文件。
    • 删除无关文件的方法(CMakeCache.txt...)试过了,没有奇迹发生。通过message 我可以看到 GLFW_LIB 是正确的:/opt/local/lib/libglfw.3.dylib,但是当它进入二进制文件时,发生了错误。我真的很想知道是什么造成了差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多