c++ - 将函数参数更改为 const 时 Makefile 不起作用

标签 c++ makefile compiler-errors ld

在使用 makefile 编译 C++ 代码时,我遇到了一个奇怪的问题。代码首先编译完美。然后我将一个函数参数更改为“const”。如果我随后编译,当代码尝试使用我将参数更改为 const 的函数时,我将收到错误消息。这可以通过删除所有 .o 文件然后再次编译来解决,但我很好奇首先导致此问题的原因。我的文件是:

MyClass.h

class MyClass {
public:
void fun(double*const c);
};

MyClass.cpp

#include "MyClass.h"
void MyClass::fun(double *const c){
};

main.cpp

#include "MyClass.h"
int main(int argc,char* argv[]) {
    MyClass foo;
    double *bar=new double[2];
    foo.fun(bar);
};

生成文件

all: main

main: Main.o MyClass.o 
    g++ -o a.out Main.o MyClass.o


Main.o: Main.cpp
    g++ -c Main.cpp


MyClass.o: MyClass.cpp
    g++ -c MyClass.cpp

如果我现在首先运行 make,一切正常。但是后来我将 fun 的签名更改为 fun(const double *const c),我收到错误消息

Main.cpp:(.text+0x3b): undefined reference to `MyClass::fun(double*)'
collect2: error: ld returned 1 exit status
Makefile:6: recipe for target 'main' failed
make: *** [main] Error 1

但是,如果我删除所有 .o 文件然后再次运行 make,它会编译。

最佳答案

规则

main.o: Main.cpp

表示 main.o 目标文件仅依赖于 Main.cpp 源文件。 但是它实际上依赖于另一个文件:MyClass.h 头文件。

目标名称的大小写也有错误。

以上两个问题意味着当你改变头文件MyClass.h来更新函数签名时,Main.o目标文件不会被重新创建并且仍然引用旧函数。

所以规则应该是

Main.o: Main.cpp MyClass.h

当您更改头文件时,该添加将导致重新编译 Main.o 目标文件。

此更改也应针对 MyClass.o 目标完成。


另请注意,main 目标使用 MyClass.o 作为依赖项,但随后您使用 MyClass.cpp 链接时的文件,而不是目标文件。

目标的名称也应该是生成文件的名称(即在您的情况下为 a.out)。

关于c++ - 将函数参数更改为 const 时 Makefile 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213614/

相关文章:

c# - 如何将命名管道字符串从非托管代码空间发送到托管代码空间?

python - 如何使用 SWIG 包装 HWND 和 HINSTANCE 类型?

c - gcc makefile 无法编译

java - Java找不到符号,错误

c++ - 自定义流对象错误?

c++ - 可执行文件中定义的函数名称(使用 dladdr)

c++ - char数组字符串混淆

Mac 上的 CUDA 编译错误

Android 只能使用 make 版本 3.81 构建

c# - “System.Data.SqlClient.SqlException”如何修复? Visual Studio 2015