【发布时间】:2016-11-25 06:18:40
【问题描述】:
我正在我用来学习的教科书中做一个示例练习。我需要做的就是编译、链接和运行以下 3 个文件:
//file my.h
extern int foo;
void print_foo();
void print(int);
my.h 是一个简单的头文件,它声明了两个函数和一个“全局”int foo,没有初始值。
//file my.cpp
#include "my.h"
#include "std_lib_facilities.h" //not included but not source of error
void print_foo()
{
cout << foo << endl;
}
void print(int i)
{
cout << i << endl;
}
my.cpp 包含 my.h 中包含的函数的实现。 std_lib_facilities.h 是教科书中的文件,不是错误的来源(根据 g++)。如果需要,我可以将其编辑到问题的正文中。
//file use.cpp
#include "my.h"
#include <iostream>
int main() {
foo = 7;
print_foo();
print(99)
char cc; cin >> cc;
return 0;
}
use.cpp 作为该程序的主要实现文件,并尝试使用所有三个已声明和定义的对象。
我采用了两步命令方法来使用 g++ 构建。首先,我编译了两个 .cpp 文件:
g++ -c my.cpp use.cpp
它创建了两个目标文件,my.o 和 use.o。我使用以下命令链接它们:
g++ -o myprog my.o use.o
给我这个错误:
Undefined symbols for architecture x86_64:
"_foo", referenced from:
print_foo() in my.o
_main in use.o
(maybe you meant: __Z9print_foov)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我试过放
int foo;
进入 my.h 而不是
extern int foo;
这给了我同样的错误。
我尝试过使用
-std=c++11
flag 也导致了同样的错误。
我正在使用装有最新 macOS(实际上只是更新)的 MacBook Pro,如果这有助于解释错误消息。
我尝试初始化 foo,但并没有改变任何东西。
另外,我试过更新命令行工具,同样的错误。
据我了解,错误告诉我,即使 my.h 包含在两个文件中,也无法使用 foo 变量(它称为 _foo)实际实现任何函数,尽管它在我的。我的猜测是链接器在后台使用了错误的名称,这使得无法链接到可执行文件。这是因为错误提到了一个
__Z9print_foov
在任何文件中都不存在。
在这一点上,它几乎看起来像是一个 g++ 或 macOS/命令行工具错误。我不想每次都添加声明,因为无论如何都会产生重复的符号错误。将 my.cpp 和 use.cpp 放入一个文件可能会正确链接,但我需要确保我实际上可以链接多个 cpp 文件,因为我最终(希望)将处理需要链接的多个 cpp 文件。任何帮助表示赞赏!
【问题讨论】:
标签: c++ linker g++ clang linker-errors