链接libMathEval的问题

Linking issues with libMathEval

本文关键字:问题 libMathEval 链接      更新时间:2023-10-16

我有一个大的源代码,我想分成一些模块(.h和.c文件)…因为我有一个独特的2000行源代码文件…

让我们进入问题:

-我在代码中使用了表达式库libMathEval…

-I用以下命令编译大的源代码文件:

gcc -DMAX_ESTRELLAS_SELECCIONADAS=1000000 crowd_2cond.c -lmatheval -o run2sec

-运行我使用:

./run2sec ./fparameters.txt

-控制台的结果是:

Tiempo para lectura de ficheros, calculo de expresiones, creacion de estructuras (listas, IndiceAVL y IndiceVector) y liberacion de IndiceAVL: 3.7689 segundos
Tiempo para algoritmo: **68.7716 segundos**
Tiempo para escritura de ficheros y liberacion de memoria: 3.9501 segundos
Tiempo SECUENCIAL total (avl-serializado 2-index 2-cond Optimizado): 76.4906 segundos

程序产生一个正确的文件输出…

但是我想把那个大的源文件放在不同的模块中…所以我从大文件的一个函数开始,现在我有两个文件(三个带头文件):

crowd_2condc(包含主函数和所有函数,减去移动到下一个文件entrada.c的函数)

entrada.c (header entrada.h):只包含一个大函数…

为了生成可执行文件,我使用以下命令:
gcc -c entrada.c
gcc -c -DMAX_ESTRELLAS_SELECCIONADAS=1000000 crowd_2cond.c
gcc -o run2sec crowd_2cond.o -lmatheval entrada.o

再次运行,我使用:

./run2sec ./fparameters.txt

结果显示:

Tiempo para lectura de ficheros, calculo de expresiones, creacion de estructuras (listas, IndiceAVL y IndiceVector) y liberacion de IndiceAVL: 3.7941 segundos
Tiempo para algoritmo: **1.4577 segundos**
Tiempo para escritura de ficheros y liberacion de memoria: 3.6116 segundos
Tiempo SECUENCIAL total (avl-serializado 2-index 2-cond Optimizado): 8.8634 segundos

程序产生的文件输出在这种情况下是不正确的…

两次执行之间的代码差异只是entrada.c中函数的分离,我没有触及更多的东西…

希望有人能帮助我提前感谢你的一切曼纽尔。

您对初始化的建议使我发现了错误。

问题是你说的初始化不好。

#ifndef ENTRADA_H
#define ENTRADA_H
#include <stdlib.h> ---This was not in the entrada.h file---
#include <stdio.h>
#include <string.h>
#include "tipos.h"
ParametrosEjecucion leerParametrosEntrada(int nparam, char *argv[], int num_lineas);
#endif

在"leerParametrosEntrada"中,我使用atof从字符串转换为浮点数,如果不包含stdlib.h文件,似乎该函数的行为会很糟糕。

包含后一切正常…

Thanks Employed Russian

此链接行:

gcc -o run2sec crowd_2cond.o -lmatheval entrada.o

不等于。要使它们完全相等,可以这样做:

gcc -o run2sec crowd_2cond.o entrada.o -lmatheval

链接行对象和库的顺序无关。

我不确定这是否能解决你的问题,但我能看出这是一个立竿见影的变化。

如果问题仍然存在,则可能是您在计算中使用了一些未初始化的值,并且您从原始编译中偶然获得的值产生了正确的答案。在valgrind下运行程序,确保没有使用未初始化的值。