【发布时间】:2015-05-03 23:02:54
【问题描述】:
我有 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-mesa-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)
但这些不是这个问题的一部分。感谢您的帮助。
【问题讨论】:
-
您是否 100% 确定这些库正在链接?
-
对于 XOpenDisplay,您需要链接到 libX11(-lX11 编译器标志),对于 glBlendFunc,您需要链接到 libGL,(-lGL 标志),对于 alGenBuffers,链接到 libopenal(-lopenal 标志) .你在这样做吗?
-
这些库在我使用的游戏引擎 (libGGE.a) 中与
TARGET_LINK_LIBRARIES(GGE ${_lib})静态链接。我使用这个引擎编译了很多程序,并且不需要显式链接 x11、libgl 等。 -
hmm... 两层链接有时意味着链接器将优化未使用的符号(但对于 idk 库不应该是这种情况)。尝试明确添加它们以查看是否有帮助
-
make VERBOSE=1并显示导致错误的行。