Centos 7带有自定义构建的GLFW二进制文件/ usr / bin / ld:/usr/local/lib/libglfw3.a(init.c.o):在`.text'部分中无法识别的重定位(0x2a)

时间:2017-07-07 19:06:28

标签: c++ linux opengl cmake linker

注意我正在使用带有source scl_soruce enable devtoolset-6的Centos 7和带有禁用noveau的rehl elrepo Nvidia驱动程序。通过devtoolset-6的gcc和g ++版本显然是GNU 6.2.1

注意我也使用libc版本ldd (GNU libc) 2.17

我关注this tutorial on opengl,但现在我被困住了。我从glfw's网站下载了源代码,并按照教程构建(并且没有看到任何错误)。我尝试使用提供的源代码和来自repo的master构建,但结果相同。

我将源文件解压缩到主目录,在里面运行cmake .,然后运行make然后运行sudo make install并且没有发生错误。

注意我还使用了opengl 3.3,

中使用的高兴实用工具

我的文件结构如下:

cmake-build-debug
    ...
include
    glad
    KHR
CMakeLists.txt
glad.c
main.cpp

这是我的源代码:

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

int main() {
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    std::cout << "Hello, World!" << std::endl;
    return 0;
}

我的CMakeLists.txt

cmake_minimum_required(VERSION 3.7)
project(opengltest)

set(CMAKE_CXX_STANDARD 11)
include_directories("include/")
set(SOURCE_FILES main.cpp glad.c)
add_executable(opengltest ${SOURCE_FILES})
target_link_libraries(opengltest -L/usr/local/lib -lglfw3 -pthread -lGLU -lGL -lrt -lXrandr -lXxf86vm -lXi -lXinerama -lX11 -ldl)

这是我得到的确切输出:

/home/centos/IDE/bin/cmake/bin/cmake --build /home/centos/IDEProjects/opengltest/cmake-build-debug --target opengltest -- -j 4
Scanning dependencies of target opengltest
gmake[3]: Warning: File `../include/KHR/khrplatform.h' has modification time 17724 s in the future
[ 66%] Building CXX object CMakeFiles/opengltest.dir/main.cpp.o
[ 66%] Building C object CMakeFiles/opengltest.dir/glad.c.o
[100%] Linking CXX executable opengltest
/usr/bin/ld: /usr/local/lib/libglfw3.a(init.c.o): unrecognized relocation (0x2a) in section `.text'
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
gmake[3]: *** [opengltest] Error 1
gmake[2]: *** [CMakeFiles/opengltest.dir/all] Error 2
gmake[1]: *** [CMakeFiles/opengltest.dir/rule] Error 2
gmake: *** [opengltest] Error 2

1 个答案:

答案 0 :(得分:1)

哇,这与令人沮丧的问题有关Centos 7有...... Centos 7有这样一个旧版本的g ++我被迫使用dev-toolset-6以获得现代版本的g ++ ie一个支持c ++ 14的人。这与当前项目(我显然使用的是c ++ 11)无关,但关于Clion的事情是默认它使用的是使用/ usr / bin /中的g ++ / gcc / gmake版本,它是不是 g ++ 6.2.1版本所在的位置。

我已经使用C ++ 14的项目解决了这个问题,进入你想要的项目的设置,并将以下行粘贴到Build,Execution,Deployment下面的CMake选项中:

-D CMAKE_CXX_COMPILER=/opt/rh/devtoolset-6/root/usr/bin/g++ -D CMAKE_C_COMPILER=/opt/rh/devtoolset-6/root/usr/bin/gcc

这是g ++的正确位置。当然我可以做一些符号链接来解决它,但我以前曾认为我在终端中找到正确版本的解决方案(修改.bashrc)也适用于clion。

当我一时兴起测试c ++ 14功能时,显然这不起作用。

现在为什么这是一个问题?我使用了两个非常不同版本的g ++ / gcc,我使用g ++ / gcc 6.2.1来编译我的GLFW,并使用4.7或其他东西来编译我的实际程序。这就是为什么我得到这个奇怪的错误。

请注意,这只能修复奇怪的.txt问题,我的cmake文件也不正确,因为我忘了定位Xcursor。新的cmake文件现在看起来像这样:

cmake_minimum_required(VERSION 3.7)
project(opengltest)

set(CMAKE_CXX_STANDARD 11)
include_directories("include/")
set(SOURCE_FILES main.cpp glad.c)
add_executable(opengltest ${SOURCE_FILES})
target_link_libraries(opengltest -L/usr/local/lib -lglfw3 -pthread -lGLU -lGL -lrt -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -ldl)

我现在没有错误(我仍然用时钟偏差发出奇怪的警告,我只是假设GLAD网络系统有问题)