在命名空间内定义函数时抛出链接器错误?
Linker errors thrown when defining a function inside of a namespace?
为什么我无法在 .cpp 文件(不是 main.cpp)的命名空间内定义函数?
例如,假设我想将我的代码拆分为 2 个不同的文件,main.cpp,然后是 lib.cpp(以及关联的 lib.h 文件)。
以下设置会引发链接器错误:
lib.h:
#ifndef LIB_H_
#define LIB_H_
namespace a{
void foo();
}
#endif
lib.cpp:
#include "lib.h"
using namespace a;
void foo(){
std::cout<<"Hello World!"<<std::endl;
}
main.cpp:
#include "lib.h"
int main(){
a::foo();
return 0;
}
不过,我能想到的几乎所有其他变体都有效。
- 在 lib.h 文件而不是 lib.cpp 文件中定义函数
- 删除命名空间有效
- 保留名称空间,而不是将 foo 作为 public 方法
class 我在主函数中实例化,然后调用,有效
在我看来这可能是约定俗成的事情?鼓励人们使用 classes 或在 .h 文件中完整定义函数?我收到的链接器错误是“架构的未定义符号(a::foo())...”
为什么会这样?
我正在 mac 使用 CLion。
你必须添加
target_link_libraries(<name of your executable> <name of your library>)
到link库符号和函数到你的可执行文件。
并且您正在全局命名空间中定义该函数。
在 lib.cpp
中像这样定义函数
void a::foo() {
...
}
查看下面代码中的注释
lib.h
#ifndef LIB_H_
#define LIB_H_
namespace a{
void foo(); // declaring a::foo()
}
#endif
lib.cpp
#include "lib.h"
using namespace a;
void foo(){ // defining ::foo() and thats why calling foo() without namespace a works
std::cout<<"Hello World!"<<std::endl;
}
using namespace a;
不是在命名空间内定义函数的方法。
语法与声明相同:namespace a { ... }
#include "lib.h"
namespace a {
void foo(){
std::cout<<"Hello World!"<<std::endl;
}
}
更多详情请参考:Namespaces.
为什么我无法在 .cpp 文件(不是 main.cpp)的命名空间内定义函数?
例如,假设我想将我的代码拆分为 2 个不同的文件,main.cpp,然后是 lib.cpp(以及关联的 lib.h 文件)。
以下设置会引发链接器错误: lib.h:
#ifndef LIB_H_
#define LIB_H_
namespace a{
void foo();
}
#endif
lib.cpp:
#include "lib.h"
using namespace a;
void foo(){
std::cout<<"Hello World!"<<std::endl;
}
main.cpp:
#include "lib.h"
int main(){
a::foo();
return 0;
}
不过,我能想到的几乎所有其他变体都有效。
- 在 lib.h 文件而不是 lib.cpp 文件中定义函数
- 删除命名空间有效
- 保留名称空间,而不是将 foo 作为 public 方法 class 我在主函数中实例化,然后调用,有效
在我看来这可能是约定俗成的事情?鼓励人们使用 classes 或在 .h 文件中完整定义函数?我收到的链接器错误是“架构的未定义符号(a::foo())...”
为什么会这样? 我正在 mac 使用 CLion。
你必须添加
target_link_libraries(<name of your executable> <name of your library>)
到link库符号和函数到你的可执行文件。
并且您正在全局命名空间中定义该函数。
在 lib.cpp
void a::foo() {
...
}
查看下面代码中的注释
lib.h
#ifndef LIB_H_
#define LIB_H_
namespace a{
void foo(); // declaring a::foo()
}
#endif
lib.cpp
#include "lib.h"
using namespace a;
void foo(){ // defining ::foo() and thats why calling foo() without namespace a works
std::cout<<"Hello World!"<<std::endl;
}
using namespace a;
不是在命名空间内定义函数的方法。
语法与声明相同:namespace a { ... }
#include "lib.h"
namespace a {
void foo(){
std::cout<<"Hello World!"<<std::endl;
}
}
更多详情请参考:Namespaces.