- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 C 语言程序,它使用 GSL 集成 ODE 系统,并将结果数据存储在数组中。代码在问题的末尾,但正如您将看到的那样,这并不是真正的问题所在。
除了 C 代码之外,我还使用 Python 脚本使用 ctypes 将数组指针传递到 C 代码中,因为我稍后想要绘制和操作数组数据。所有这些都很好,它适用于小型测试程序。但为此,我需要使用 gcc 创建一个共享库。这就是问题所在。
当我用
编译时 gcc ctest.c -o ctest.o -std=c11 -Wall -g -lgsl -lgslcblas -lm
代码运行良好。我有一个主要功能,可以复制用于测试的 Python 脚本,并且没有任何中断。仅供引用,-lgsl
和 -lgslcblas
标志用于使链接器停止提示缺少 GSL 声明。但是当我尝试使用
gcc ctest.c -o ctest.o -std=c11 -Wall -g -lgsl -lgslcblas -lm -fPIC -Wl,-shared,-soname,ctest.so
gcc 吐出这个错误:
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0xe): undefined reference to `__init_array_start'
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_start' can not be used when making a shared object
/usr/bin/x86_64-linux-gnu-ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
这让我很困惑。我在网上四处看看,这似乎是对象初始化的问题,这对我来说仍然很奇怪,因为我只使用内置类型来创建数组,除非它是 GSL 搞砸了。
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_odeiv2.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_complex_math.h>
#define pi M_PI
//#define HAVE_INLINE
typedef struct funcParams {
double I;
double J;
double s;
} funcParams;
int diff (double t, const double y[], double dy[], void * params) {
#define I() IJs.I
#define J() IJs.J
#define s() IJs.s
#define w1 y[0]
#define w2 y[1]
#define w3 y[2]
#define e1 y[3]
#define e2 y[4]
#define e3 y[5]
#define e4 y[6]
t = 0;
funcParams IJs = *(funcParams*) params;
dy[0] = 2*pi * ( (1-J() /I() )*( 6*(1-2*e1*e1-2*e2*e2)*(e2*e3+e1*e4) - w2*w3) + w3*s() );
dy[1] = 0;
dy[2] = 2*pi * ( (J() /I() -1)*(12*(e1*e3-e2*e4)*(e2*e3+e1*e4) - w1*w2) - w1*s() );
dy[3] = pi * (w3*e2 + w1*e4 - e3*(w2-s()+1));
dy[4] = pi * (w1*e3 - w3*e1 + e4*(w2-s()-1));
dy[5] = pi * (-w1*e2 + w3*e4 + e1*(w2-s()+1));
dy[6] = pi * (-w1*e1 - w3*e3 - e2*(w2-s()-1));
return GSL_SUCCESS;
}
void quat2C( double* e, double C[3][3]) {
#undef e1
#undef e2
#undef e3
#undef e4
#define e1 e[0]
#define e2 e[1]
#define e3 e[2]
#define e4 e[3]
C[0][0] = 1 - 2*e2*e2 - 2*e3*e3;
C[0][1] = 2 * (e1*e2 - e3*e4);
C[0][2] = 2 * (e3*e1 + e2*e4);
C[1][0] = 2 * (e1*e2 + e3*e4);
C[1][1] = 1 - 2 * e3*e3 - 2 * e1*e1;
C[1][2] = 2 * (e2*e3 - e1*e4);
C[2][0] = 2 * (e3*e1 - e2*e4);
C[2][1] = 2 * (e2*e3 + e1*e4);
C[2][2] = 1 - 2 * e1*e1 - 2 * e2*e2;
return;
}
void timeHistories (double nut0, double x, double vf, int N, double I, double J, double s, double* states, double * nut, double* gamma, double* beta, double* dLambda) {
funcParams IJs = {I, J, s};
gsl_odeiv2_system sys = {diff, NULL, 7, &IJs};
gsl_odeiv2_driver* d = gsl_odeiv2_driver_alloc_y_new(&sys, gsl_odeiv2_step_rkf45, 1e-6, 1e-6, 0.0);
double* states_i = (double*)malloc(7*sizeof(double));
states_i[0] = 0;
states_i[1] = x;
states_i[2] = 0;
states_i[3] = sin(nut0*pi/360);
states_i[4] = 0;
states_i[5] = 0;
states_i[6] = cos(nut0*pi/360);
double v = 0.0;
double C[3][3];
/* retrieve the states at each time. This allows us to modify each of the
"returned" arrays in the same loop */
for (int i = 0; i < N; ++i) {
double vi = i*vf/N; // current revolution value
printf("vi got\n");
gsl_odeiv2_driver_apply(d, &v, vi, states_i); // get states
printf("states got\n");
quat2C(&states_i[3],C);
printf("C got\n");
printf("%d: %f %f %f %f %f %f %f\n", i, states_i[0], states_i[1], states_i[2], states_i[3], states_i[4], states_i[5], states_i[6]);
}
return;
}
int main() {
double I = 450;
double J = 75;
int N = gsl_pow_int(2,14);
double* states = (double*)malloc(N*sizeof(double));
double* nut = (double*)malloc(N*sizeof(double));
double* gamma = (double*)malloc(N*sizeof(double));
double* beta = (double*)malloc(N*sizeof(double));
double* dLambda = (double*)malloc(sizeof(double));
double vf = 4;
double nut0 = 6;
double x = 20;
double s = 0;
timeHistories(nut0, x, vf, N, I, J, s, states, nut, gamma, beta, dLambda);
return 0;
}
最佳答案
感谢 Andrew Henle,问题已得到解决。使用
拆分编译和链接gcc -c -std=c11 -fPIC -g -o ctest.o ctest.c && gcc -o libctest.so ctest.o -lgsl -lgslcblas -lm -shared
生成可由 Python 调用的共享可执行文件(无论如何通过 ctypes)。我不确定为什么,但是使用 -shared
与使用 -Wl,-shared
将命令传递给链接器相反。
关于c - 共享标志的重定位编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203318/
是否有任何库或框架旨在促进从另一种成熟的编程语言中构建项目? 在 C++、java 等编程语言中指定逻辑、集合和复杂规则非常容易,但在 Makefile 中完成这些事情似乎是一场艰苦的战斗。我还没有深
我有这段代码可以用 clang 编译得很好(即使使用 -Weverything),但是 gcc 会发出错误。 #include #include #include using namespace
我有以下 block 头文件 BKE_mesh.h: /* Connectivity data */ typedef struct IndexNode { struct IndexNode *
我在我的一个项目中遇到了一个奇怪的问题。我的代码库依赖于一个外部库,其中包含一个名为 Dataset 的类. Dataset类私有(private)继承自 std::vector (其中 Sample
当使用 gcc、g++ 或 make 在终端中编译一个小型 C 或 C++ 项目时,我收到以下错误: /tmp/ccG1caGi.o: In function `main': main.c:(.tex
我正在尝试从 CVS 为 Windows 上的 Emacs 23.1.50 编译 CEDET,但在“第 6 步:打开 EDE...”时出现错误:“defvar:作为变量的符号值是无效的:cedet-m
我正在(重新)学习编程,我从 C 开始。我的 IDE(如果我可以这么说)是 Windows7 上的 cygwin(32 位)和 Visual-Studio 2010。我总是编译我用 gcc (cygw
我喜欢在模板类中使用本地类来执行类似“static if”的构造。但是我遇到了 gcc 4.8 不想编译我的代码的问题。但是 4.7 可以。 这个例子: #include #include #in
我有一个项目,必须仅使用 java 1.4 进行编译。但我计划使用mockito 编写一些单元测试。我想要一种在 pom 中指定的方法,以便 src/main/java 使用 jdk 1.4 编译,但
我想了解 PHP 编译过程是如何工作的。 假设我有一个名为funcs.php 的文件并且这个文件有三个函数,如果我include 或require 它,所有的在文件加载期间编译三个函数?或者源代码会被
编译工具链 我们写程序的时候用的都是集成开发环境 (IDE: Integrated Development Environment),集成开发环境可以极大地方便我们程序员编写程序,但是配置起来
当我编写一些 Scala 代码时,在尝试编译代码时收到一条奇怪的错误消息。我将代码分解为一个更简单的代码(从语义的角度来看这完全没有意义,但仍然显示了错误)。 scala> :paste // Ent
我正在编译一个 SCSS 文件,它似乎删除了我的评论。我可以使用什么命令来保留所有评论? >SASS input.scss output.css 我在 SCSS 中看到两种类型的注释。 // Comm
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
当您编译 grails war 时,我知道 .groovy 代码被编译为字节码类文件,但我不明白容器(例如 tomcat)如何在请求 GSP 时知道如何编译它们。容器了解 GSP 吗?安装在服务器上的
我正在努力将多个文件编译成一个通用程序。我收到一个错误: undefined reference to 'pi' 这是我的代码和 Makefile 的框架。我做错了什么?谢谢! 文件:calcPi.c
我尝试使用 LD_PRELOAD 来 Hook sprintf function ,所以我将打印到缓冲区的结果: #define _GNU_SOURCE #include #include int
我正在寻找最简单的方法来自动将 CoffeeScript 重新编译为 JS。 阅读documentation但仍然很难得到我想要的东西。 我需要它来监视文件夹 src/ 中的任何 *.coffee 文
我想使用定制waveformjs 。我发现this on SO但是,我不知道如何编译/安装波形来开始。我从 GitHub 克隆它并进行了更改,但是我不知道如何将其转换为 .js 文件。 最佳答案 为了
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!