未定义的非成员函数引用 - C ++

时间:2010-01-17 17:30:05

标签: c++ gcc linker-errors

我在头文件中有以下内容。

namespace silc{
   class pattern_token_map
   {
      /* Contents */
   };

   pattern_token_map* load_from_file(const char*);
}

在CPP文件中(这有适当的包含)

pattern_token_map* load_from_file(const char* filename)
{
   // Implementation goes here
}

在另一个CPP文件中。这已经得到了所有适当的包括。

void some_method()
{
    const char* filename = "sample.xml";
    pattern_token_map* map = load_from_file( filename ); // Linker complains about this.
}

我收到一个链接器错误,指出对load_from_file的未定义引用。我无法看到这里出了什么问题。

任何帮助将不胜感激。

编译器:G ++ 操作系统:Ubuntu 9.10

修改

这是使用的链接器命令。

g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out  src/phonetic_kit/pattern_token_map.o  tests/pattern_token_map_tests.o  tests/main.o -lUnitTest++

错误来自pattern_token_map_tests.o,该功能在pattern_token_map.o中可用。所以我猜连接的顺序并不是问题所在。 (我已从命令中删除了一些文件以简化它)

2 个答案:

答案 0 :(得分:9)

实施时,您必须确保实施正确的功能:

namespace silc {
pattern_token_map* load_from_file(const char* filename) {
   // Implementation goes here
}
}

如果您改为这样做:

using namespace silc; // to get pattern_token_map
pattern_token_map* load_from_file(const char* filename) {
   // Implementation goes here
}

然后你要定义新函数而不是silc :: load_from_file。

避免在函数范围之外使用指令(“using namespace ...;”)作为一般准则:

using namespace silc; // outside function scope: avoid

silc::pattern_token_map*                      // qualify return type
random_function(silc::pattern_token_map* p) { // and parameters
  using namespace silc; // inside function scope: fine
  pattern_token_map* p2 = 0; // don't have to qualify inside the function
                             // if you want to use the using directive
  silc::pattern_token_map* p3 = 0; // but you can always do this
  return 0;
}

答案 1 :(得分:0)

在链接阶段,您是否链接了通过编译第一个cpp文件创建的目标文件?当一个对象引用未链接的对象中包含的符号时,会出现类似这样的链接器错误。

编辑:我仍然有理由相信这是问题所在。在第一个文件中,是否有预处理器符号重新定义load_from_file?