链接器未在目标文件中找到现有引用

时间:2014-08-23 23:21:10

标签: c++ linker g++

我在编译项目时遇到了麻烦,基本上是链接对象。链接器抱怨:

$ g++ -o bin/program obj/linux64/Debug/src/main.o  [... more object files ...] ../../../addons/obj/linux64/Debug/ofxLua/libs/lua/lua/lapi.o [...many other object files and libraries...]
../../../addons/obj/linux64/Debug/ofxLua/libs/luabind/src/scope.o: In function `~lua_pop_stack':
../../../addons/ofxLua/libs/luabind/src/scope.cpp:122: undefined reference to `lua_settop(lua_State*, int)'
[...many more undefined reference errors...]

但如果我检查目标文件,我会找到符号:

$ nm ../../../addons/obj/linux64/Debug/ofxLua/libs/lua/lua/lapi.o | grep lua_settop
000000000000045c T lua_settop

我检查了g ++参数are correctly ordered

这种行为的原因是什么?我能想到的唯一解释是,不同的源文件中使用的标题以某种方式被以前的包含或定义改变了。有什么方法可以检查生成的完整符号,这样我可以确定是这样的吗?

1 个答案:

答案 0 :(得分:3)

如果要包含用C编写的代码的标头,则需要在#include中包含extern "C" { ... }语句,以便C ++编译器知道对这些符号使用C-linkage,而不是C ++ -linkage(使用名称修改来允许方法重载)。

例如:

extern "C" {
#include <file.h>
}

真的头文件本身应该这样做,以避免你需要,我会认为这是一个错误不这样做:

//
// file.h
//
#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}    // extern "C"
#endif