C++ 源代码生成的gcc链接错误

C++ 源代码生成的gcc链接错误,c++,c++11,gcc,C++,C++11,Gcc,我有Debian Wheezy,我需要C++11特性来构建我的项目。我已经从源编译了GCC(C和C++),并使用问题把库放在我的主文件夹中。我还使用了那个回答这个问题的人提供的包装器脚本 $HOME/gcc/gcc-4.8.4/bin/g++ -Wl,-rpath,$HOME/gcc/gcc-4.8.4/lib32 "$@" 现在,我有一个游戏引擎,在我的项目中用于GUI和图形操作。它以32位的格式编译,非常好。我通过它使用的所有外部库和引擎本身的-m32开关。另外,为了让cmake找到我的包

我有Debian Wheezy,我需要C++11特性来构建我的项目。我已经从源编译了GCC(C和C++),并使用问题把库放在我的主文件夹中。我还使用了那个回答这个问题的人提供的包装器脚本

$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 mesa开发:i386
  • libopenal开发人员:i386
  • libx11开发人员: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)
更新

埃隆的回答起了作用。我还必须安装libalut dev:i386和link(
-lalut
)才能成功编译。我收到许多类似以下的警告消息(可能是由于引入了同一库的附加链接)


但这些都不是问题的一部分。感谢您的帮助。

可能是报告丢失的符号未被游戏引擎库使用,因此被“优化”为更小的二进制文件


尝试将目标可执行文件与
-lX11
-lGL
明确链接,看看这是否有效。

正如@ereOn所说,链接器可能优化了一些符号。尝试使用
-Wl,--no-as-needed

链接是否100%确定正在链接库?对于XOpenDisplay,需要链接到libX11(-lX11编译器标志),对于glBlendFunc,需要链接到libGL(-lGL标志),对于alGenBuffers,需要链接到libopenal(-lopenal标志)。你这样做了吗?这些库在我使用的游戏引擎(libGGE.a)中与
TARGET\u LINK\u库(GGE${u lib})
静态链接。我使用这个引擎编译了很多程序,从来都不需要显式链接x11、libgl等。。。两层链接有时意味着链接器将优化掉未使用的符号(但对于idk这样的库不应该如此)。尝试显式添加它们,看看它是否有助于
使VERBOSE=1
,并显示导致错误的行。这是默认设置(Ubuntu提供的gcc除外)。
/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)