“架构 x86_64 的未定义符号”试图包含来自另一个文件的函数

Posted

技术标签:

【中文标题】“架构 x86_64 的未定义符号”试图包含来自另一个文件的函数【英文标题】:"Undefined symbols for architecture x86_64" trying to include function from another file 【发布时间】:2015-10-28 03:01:15 【问题描述】:

我正在尝试在另一个程序 event_rate.cpp 中包含一个名为 kinematicfactor 的函数,用 kinematic_factor.cpp 编写。

kinematic_factor.cpp:

#include "kinematic_factor.hpp"

double kinematicfactor (double md) 
    double mt = 17.6924; // Mass of Fluorine [GeV/c^2]
    double r = 4*mt*md/pow(mt+md, 2);
    return r;

kinematic_factor.hpp:

#ifndef kinematic_factor_hpp
#define kinematic_factor_hpp

double kinematicfactor (double md);

#endif /* kinematic_factor_hpp */

event_rate:

#include "event_rate.hpp"
#include "kinematic_factor.hpp"

#include <iostream>
#include <cmath>

using namespace std;

int main() 
    cout << kinematic_factor(1.0) << endl;

据我所知,这是我应该这样做的,但我得到了一个错误:

Undefined symbols for architecture x86_64:
  "kinematicfactor(double)", referenced from:
      _main in event_rate-1d17f7.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我做错了什么?

编辑:我试过了

#include "kinematic_factor.cpp"

它奏效了。但是我听说包含 cpp 文件(而不是头文件)对学习者来说是一种不好的做法……我该怎么办?

【问题讨论】:

我可以看到函数名kinematic_factorkinematicfactor在声明和函数调用中是不一样的,更正名称可以解决问题。正确遵循编译和链接步骤 【参考方案1】:

你是如何编译这个程序的,我能够正确编译相同的程序。我怀疑它应该是链接问题。

需要一起编译源码才能编译链接。

g++ kinematic_factor.cpp event_rate.cpp -o event_rate

【讨论】:

非常感谢您的帮助!

以上是关于“架构 x86_64 的未定义符号”试图包含来自另一个文件的函数的主要内容,如果未能解决你的问题,请参考以下文章

终端中的“架构 x86_64 的未定义符号”,但 xcode 中没有错误

架构 x86_64 / i386 的未定义符号

Quickblox:架构 x86_64 的未定义符号:错误

GoogleMapsSDK:架构 x86_64 的未定义符号

Cordova - 架构 x86_64 的未定义符号

架构 x86_64 的未定义符号:MqtUtil