gpt4 book ai didi

c++ - g++ 无法将 .o 文件链接到可执行文件

转载 作者:行者123 更新时间:2023-11-30 03:36:14 25 4
gpt4 key购买 nike

我正在对我用来学习的教科书进行示例练习。我需要做的就是编译、链接并运行以下 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

标志以及导致相同的错误。

我使用的是装有最新 macOS(实际上刚刚更新)的 MacBook Pro,如果这有助于解释错误消息的话。

我已经尝试初始化 foo,但没有任何改变。

此外,我尝试更新命令行工具,同样的错误。

据我所知,错误告诉我,即使 my.h 包含在两个文件中,但实际上没有一个可以使用 foo 变量(它称为 _foo)实现任何函数,尽管它在我的。我的猜测是链接器在后台使用了错误的名称,这使得无法链接到可执行文件。这是因为错误提到了一个

__Z9print_foov

在任何文件中都不存在。

在这一点上,它几乎看起来像是 g++ 或 macOS/命令行工具的错误。我不想每次都添加声明,因为无论如何都会产生重复的符号错误。将 my.cpp 和 use.cpp 放入一个文件中可能会正确链接,但我需要确保我实际上可以链接多个 cpp 文件,因为我最终(希望)会处理需要链接的多个 cpp 文件。任何帮助表示赞赏!

最佳答案

在这里声明一个变量:

extern int foo;

然后你使用变量:

cout << foo << endl;

但是你没有在任何地方定义变量。链接器错误表示链接器找不到变量的定义。要解决此问题,请将 int foo; 放在 .cpp 文件之一的文件范围内。

在问题中,您说将 extern int foo; 更改为 int foo; 会产生相同的错误。但是,如果您更仔细地查看错误消息,我想您会发现它给出了不同的消息,关于多个定义。

关于c++ - g++ 无法将 .o 文件链接到可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40798844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com