已经搜索了足够的答案,但没有一个解决方案适合我。
场景: 我试图包含一个.h文件,其中声明了一些函数(未定义)和一些变量声明。
如果我将这个头文件包含在实际使用函数和变量的源文件中(准确地说是2),那么最后编译的头文件会有一个链接器错误,表明
未定义引用`abc :: myfun(char const *,char const *,char *)'
头文件中的所有函数和变量都已声明为extern,并且包含防护。
我希望有一个cpp文件在.h文件中定义的变量中放置一个值,另一个cpp文件能够读取它。
如果它有帮助,我的每一段代码都在我定义的命名空间中(namespace abc{ //all my code, in all the files }
)
答案 0 :(得分:3)
.h
文件中的声明正是这样做的 - 让编译器知道 “某处”将是一个编译单元(.c
或.cpp
文件),其中该变量将定义。
这是一个例子(为简单起见跳过警卫):
foo.h
:
extern int global_foo;
foo.c
:
#include "foo.h"
int global_foo; // optionally you can initialize like this: int global_foo = 123;
main.c
:
#include "foo.h"
void bar()
{
global_foo = 0; // accessing that variable which is "outside" of this file
正如上面提到的paddy - 确保您不会意外地嵌套命名空间,因为abc::something
与abc::abc::something
答案 1 :(得分:0)
您的错误似乎与abc::myfun(char const*, char const*, char*)
有关。我能够重现并证实这一点。如果没有第二部分,您将收到错误。
我猜你有一个类似
的头文件namespace abc
{
void myfun(char const* p1, char const* p2, char* p3);
}
和.cpp源文件需要
namespace abc
{
void myfun(char const* p1, char const* p2, char* p3)
{
// do fun stuff
}
}