我在头文件中有以下内容。
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
中可用。所以我猜连接的顺序并不是问题所在。 (我已从命令中删除了一些文件以简化它)
答案 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?