【问题标题】:ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1ld:未找到体系结构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1
【发布时间】:2025-12-01 22:00:02
【问题描述】:

我在 MAC OS 上使用 SWIG 将 C++ 代码转换为 python 代码。我以前使用过 SWIG,但现在我有一些我没有成功管理的错误。因此,为了使用 SWIG,我创建了一个文件 RBergomi.i 并应用了以下命令

swig -c++ -python RBergomi.i

g++ -O2 -fPIC -c -std=c++11 RBergomi_wrap.cxx -I/Users/.../anaconda/include/python2.7

g++ -std=c++11 -shared RBergomi_wrap.o -o RBergomi.so

但我收到此错误

"ld: 未找到架构 x86_64 的符号

clang:错误:链接器命令失败,退出代码为 1"

我试图寻找问题,似乎错误来自使用 std::accumulate,要使用它我需要调用“numeric”标头,然后我遇到了问题。如果我删除标题“数字”,我不再有以前的错误,但累积是未知的。在我的 RBergomi.cpp 文件的代码下方

#include "rBergomi.h"

double updatePayoff_cholesky(Vector& Wtilde, const Vector& W1,
    Vector& v, double eta, double H, double rho, double xi,
    double T, double K, int N){
double dt = T / N;
double sdt = sqrt(dt);
scaleVector(Wtilde, pow(T, H)); // scale Wtilde for time T
compute_V(v, Wtilde, H, eta, xi, dt); // compute instantaneous variance v
double Ivdt = intVdt(v, dt);
double IsvdW = intRootVdW(v, W1, sdt);
double BS_vol = sqrt((1.0 - rho * rho) * Ivdt);
double BS_spot = exp(-0.5 * rho * rho * Ivdt + rho * IsvdW);
return BS_call_price(BS_spot, K, 1.0, BS_vol);}
void compute_V(Vector& v, const Vector& Wtilde, double H, double eta, double xi,
    double dt) {
v[0] = xi;
for (int i = 1; i < v.size(); ++i)
    v[i] = xi
            * exp(
                    eta * Wtilde[i - 1]
                            - 0.5 * eta * eta * pow(i * dt, 2 * H));}

double intVdt(const Vector & v, double dt) {
return dt * std::accumulate(v.begin(), v.end(), 0.0);}
double intRootVdW(const Vector & v, const Vector & W1, double sdt) {
double IsvdW = 0.0;
for (size_t i = 0; i < v.size(); ++i)
    IsvdW += sqrt(v[i]) * sdt * W1[i];
return IsvdW;}
double pnorm(double value) {
return 0.5 * erfc(-value * M_SQRT1_2); }
double BS_call_price(double S0, double K, double tau, double sigma, double r) {
double d1 = (log(S0 / K) + (r + 0.5 * sigma * sigma) * tau)
        / (sigma * sqrt(tau));
double d2 = d1 - sigma * sqrt(tau);
return pnorm(d1) * S0 - pnorm(d2) * K * exp(-r * tau);}

【问题讨论】:

  • 你需要链接到python。

标签: c++11 g++ swig ld


【解决方案1】:

我通过使用-lpython -dynamiclib 解决链接问题解决了这个问题,给出:

swig -c++ -python RBergomi.i

g++ -O2 -fPIC -c RBergomi.cpp

g++ -O2 -fPIC -c  RBergomi_wrap.cxx -I/Users/hammouc/anaconda/include/python2.7

g++ -lpython -dynamiclib RBergomi.o RBergomi_wrap.o -o _RBergomi.so

【讨论】: