源码建立的gcc链接错误

时间:2015-04-17 13:09:43

标签: c++ c++11 gcc

我有Debian Wheezy,我需要C ++ 11功能来构建我的项目。我从源代码编译了gcc(仅限c和c ++),并使用this问题将库放在我的主文件夹下。我也在使用回答该问题的人提供的包装脚本

$HOME/gcc/gcc-4.8.4/bin/g++ -Wl,-rpath,$HOME/gcc/gcc-4.8.4/lib32 "$@"

现在,我有一个游戏引擎,我在我的项目中用于GUI和图形操作。它编译成32位就好了。我为它使用的所有外部库和引擎本身传递-m32开关。另外,为了让cmake找到我的包装器,我在运行cmake时给出了以下选项

cmake .. -DCMAKE_CXX_COMPILER=path/to/my/32-bit-wrapper

编译后,它提供以下链接错误

undefined reference to `XOpenDisplay'
undefined reference to `glBlendFunc'
undefined reference to `alGenBuffers'

起初,我以为我可能缺少32位开发库,所以我安装了以下软件包。

  • 的libgl1-台面-dev的:I386
  • libopenal-dev的:I386
  • 的libx11-dev的:I386

但无论如何我都会遇到错误。那么,我该如何解决这个问题呢?如果需要,我可以提供其他信息,如cmake文件等。提前谢谢。

修改

Cmake文件,以防错误源于它

cmake_minimum_required(VERSION 2.8.3)

project(uwmf)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m32 -DLINUX")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -DLINUX")
#set(CMAKE_CXX_COMPILER "${HOME_PATH}/devel/g++-4.8.4-32")
#set(CMAKE_C_COMPILER "${HOME_PATH}/devel/gcc-4.8.4-32")

message("${CMAKE_CXX_FLAGS}")
message("${CMAKE_C_FLAGS}")
message("${CMAKE_CXX_COMPILER}")
message("${CMAKE_C_COMPILER}")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
set(GGE ${HOME_PATH}/devel/gorgon-3.x)
set(GRAPHICS ${HOME_PATH}/devel/graphics)

set(SOURCES
  src/source.cpp
  src/algorithms.h
  src/cloud-gen.h
  src/latex.h
  src/macros.h
  src/matrix.h
  src/utils.h    
)

include_directories(${GGE})
include_directories(${GRAPHICS})

add_executable(uwmf ${SOURCES})


target_link_libraries(uwmf ${GGE}/build/libGGE.a)

更新

ereOn的答案就行了。我还必须安装libalut-dev:i386并链接(-lalut)才能成功编译。我得到了许多警告信息,如下所示(可能是由于引入了相同库的附加链接)

/usr/bin/ld: Warning: type of symbol `glDrawBuffers' changed from 2 to 1 in ../devel/gorgon-3.x/build/libGGE.a(OpenGL.cpp.o)
/usr/bin/ld: Warning: type of symbol `glGetAttribLocation' changed from 2 to 1 in ../devel/gorgon-3.x/build/libGGE.a(OpenGL.cpp.o)

但这些不是这个问题的一部分。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

可能是您的游戏引擎库未使用报告丢失的符号,因此“优化”以生成较小的二进制文件。

尝试使用-lX11-lGL明确地链接目标可执行文件,看看是否有效。

答案 1 :(得分:0)

正如@ereOn所说,链接器可以优化出一些符号。尝试与-Wl,--no-as-needed进行关联。