【问题标题】:Compile Makefile on Win8/Ubuntu behaves differently?在 Win8/Ubuntu 上编译 Makefile 行为不同?
【发布时间】:2014-02-19 14:39:58
【问题描述】:

我得到了一个 C 代码,它是用一些我想移植到 Windows 的 Linux 衍生版本编写的。 我对 Makefile 做了一些改动,并使用了 mingw32-make 来编译它们。 生成的执行文件运行良好,直到我看到结果。
该程序用于进行一些数据分析,并应生成一个 20 到 100 之间的数字列表。例如数据,48.442 周围应该有 3 个数字。
但是,当我运行 Windows 可执行文件时,我得到 3 个数字,大约为 2921363591658985300000000000000000000000000000.000

然后我安装了 virtualbox 并尝试使用“make”作为控制台命令运行原始 Makefile,但它抱怨说没有请求数学库(pow 未定义等),尽管 -lm 已插入每个 gcc 命令。

windows Makefile:

COMPILER_OPT = -O3

all: extract_timestamps

extract_timestamps: extract_timestamps.c collection.o filename_treatment.o basic_analysis.o  read_lecroy_file.o read_tek_file.o stamp_handling.o treat_lecroy_file.o treat_tek_file.o save_timestamps.o injection_statistics.o calc_time_stamp.o peak_finding.o get_timestamps.o time_ext.h -lm
    gcc -lm -o extract_timestamps.exe basic_analysis.c calc_time_stamp.c collection.c extract_timestamps.c filename_treatment.c get_timestamps.c injection_statistics.c peak_finding.c read_lecroy_file.c read_tek_file.c save_timestamps.c stamp_handling.c treat_lecroy_file.c treat_tek_file.c  $(COMPILER_OPT) 


get_timestamps.o: get_timestamps.c time_ext.h
    gcc $(COMPILER_OPT) -c get_timestamps.c -lm

peak_finding.o: peak_finding.c time_ext.h
    gcc $(COMPILER_OPT) -c -o peak_finding.o peak_finding.c -lm

calc_time_stamp.o: calc_time_stamp.c time_ext.h
    gcc $(COMPILER_OPT) -c -o calc_time_stamp.o calc_time_stamp.c -lm

injection_statistics.o: injection_statistics.c time_ext.h
    gcc $(COMPILER_OPT) -c -o injection_statistics.o injection_statistics.c -lm

save_timestamps.o: save_timestamps.c time_ext.h
    gcc $(COMPILER_OPT) -c -o save_timestamps.o save_timestamps.c -lm

filename_treatment.o: filename_treatment.c time_ext.h
    gcc $(COMPILER_OPT) -c -o filename_treatment.o filename_treatment.c -lm

basic_analysis.o: basic_analysis.c time_ext.h
    gcc $(COMPILER_OPT) -c -o basic_analysis.o basic_analysis.c -lm

collection.o: collection.c time_ext.h
    gcc $(COMPILER_OPT) -c -o collection.o collection.c -lm

read_lecroy_file.o: read_lecroy_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o read_lecroy_file.o read_lecroy_file.c -lm

read_tek_file.o: read_tek_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o read_tek_file.o read_tek_file.c -lm

stamp_handling.o: stamp_handling.c time_ext.h
    gcc $(COMPILER_OPT) -c -o stamp_handling.o stamp_handling.c -lm

treat_lecroy_file.o: treat_lecroy_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o treat_lecroy_file.o treat_lecroy_file.c -lm

treat_tek_file.o: treat_tek_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o treat_tek_file.o treat_tek_file.c -lm

clean:
    delete filename_treatment.o basic_analysis.o collection.o read_lecroy_file.o stamp_handling.o treat_lecroy_file.o save_timestamps.o injection_statistics.o calc_time_stamp.o peak_finding.o extract_timestamps read_tek_file.o treat_tek_file.o

ubuntu Makefile:

COMPILER_OPT = -O3

all: extract_timestamps

extract_timestamps: extract_timestamps.c filename_treatment.o basic_analysis.o collection.o \
            read_lecroy_file.o read_tek_file.o stamp_handling.o treat_lecroy_file.o \
            treat_tek_file.o save_timestamps.o injection_statistics.o calc_time_stamp.o \
            peak_finding.o get_timestamps.o time_ext.h
    gcc $(COMPILER_OPT) -o extract_timestamps extract_timestamps.c filename_treatment.o \
                   basic_analysis.o collection.o read_lecroy_file.o read_tek_file.o stamp_handling.o \
                       treat_lecroy_file.o treat_tek_file.o save_timestamps.o injection_statistics.o \
               calc_time_stamp.o peak_finding.o get_timestamps.o; chmod go+rx extract_timestamps -lm


get_timestamps.o: get_timestamps.c time_ext.h
    gcc $(COMPILER_OPT) -c get_timestamps.c -lm

peak_finding.o: peak_finding.c time_ext.h
    gcc $(COMPILER_OPT) -c -o peak_finding.o peak_finding.c -lm

calc_time_stamp.o: calc_time_stamp.c time_ext.h
    gcc $(COMPILER_OPT) -c -o calc_time_stamp.o calc_time_stamp.c -lm

injection_statistics.o: injection_statistics.c time_ext.h
    gcc $(COMPILER_OPT) -c -o injection_statistics.o injection_statistics.c -lm

save_timestamps.o: save_timestamps.c time_ext.h
    gcc $(COMPILER_OPT) -c -o save_timestamps.o save_timestamps.c -lm

filename_treatment.o: filename_treatment.c time_ext.h
    gcc $(COMPILER_OPT) -c -o filename_treatment.o filename_treatment.c -lm

basic_analysis.o: basic_analysis.c time_ext.h
    gcc $(COMPILER_OPT) -c -o basic_analysis.o basic_analysis.c -lm

collection.o: collection.c time_ext.h
    gcc $(COMPILER_OPT) -c -o collection.o collection.c -lm

read_lecroy_file.o: read_lecroy_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o read_lecroy_file.o read_lecroy_file.c -lm

read_tek_file.o: read_tek_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o read_tek_file.o read_tek_file.c -lm

stamp_handling.o: stamp_handling.c time_ext.h
    gcc $(COMPILER_OPT) -c -o stamp_handling.o stamp_handling.c -lm

treat_lecroy_file.o: treat_lecroy_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o treat_lecroy_file.o treat_lecroy_file.c -lm

treat_tek_file.o: treat_tek_file.c time_ext.h
    gcc $(COMPILER_OPT) -c -o treat_tek_file.o treat_tek_file.c -lm

clean:
    rm filename_treatment.o basic_analysis.o collection.o \
           read_lecroy_file.o stamp_handling.o treat_lecroy_file.o save_timestamps.o \
       injection_statistics.o calc_time_stamp.o peak_finding.o \
       read_tek_file.o treat_tek_file.o \

命令行命令是“mingw32-make.exe”和“make”,不带参数,在目录中。

不得不说,我一般不会那样直接编译的。
通常我会让自己对某些具有工作默认设置的 GUI 感到安慰,以正确编译某些东西。这可能就是为什么我在这里错过了一些基本的东西。

你能告诉我为什么 windows-executable 处理数字错误以及为什么我无法在 ubuntu 中编译吗?

编辑:
这是主要的 C 代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <unistd.h>
#include <getopt.h>
#include "time_ext.h"

#define DEBUG
//#undef DEBUG

typedef struct{
  char Inputfile[64];
  char Outputfile[64];
  double Fraction;
  int Shift;
  double Threshold;
  int timing;
  int TekwithCapHeader;    /* 1=tektronix with capital header letter,0=LeCroy */
  int TekwithSmallHeader;  /* 1=tektronix with small header letter,0=LeCroy */
}gParameters;



gParameters gParms={
  "infile.dat",
  "outfile.times",
  0.5,                /* fraction */
  8,                  /* shift */
 -8.0,                /* threshold in volts */
  2,                  /* timing method; 1=extrapolation to zero, 2=cfd,3=single threshold*/
  0,                  /* type of the scope with a Capital header*/
  0                   /* type of the scope with a small header*/
};


main(int argc, char **argv){
  int subroutine_return_value;
  FILE *listfp,*outfp,*logfp;
  char lecroyfilename[256],logfilename[256];
  char tekfilename[256], tekheaderfilename[256];    
  /*  int events=0,file_nr=0,shot=0,total_events=0; */
  void *extr_parameters;
  sTraceLimits limits;
  int shot_number=0;
  int number_of_shots;
  int number_of_signals_in_shot, number_of_signals_total;

  // int treat_lecroy_files(char *, FILE *, void *, FILE *,int, int *); /* might change */

  uExtractedParameter get_extraction_parameter(void *, int, int);
  void *parameter_collection(gParameters);


  /* start code */


  /* initialize some things */
  if(getArgs(argc,argv)!=0){
    printf(" !! invalid arguments.....\n      ...... bye!\n");exit(-3);}
  sprintf(logfilename,"%s.log",gParms.Outputfile);
  if((listfp=fopen(gParms.Inputfile,"r"))==NULL){
    fprintf(stderr," !! ERROR: can't open main-inputfile %s, terminating...\n",gParms.Inputfile);exit(-1);}
  if((outfp=fopen(gParms.Outputfile,"w"))==NULL){
    fprintf(stderr," !! ERROR: can't open outputfile %s, terminating...\n",gParms.Outputfile);exit(-1);}
  if((logfp=fopen(logfilename,"w"))==NULL){
    fprintf(stderr," !! ERROR: can't open logfile %s, terminating...\n",logfilename);exit(-1);}
  fprintf(logfp,"logfile to outputfile %s created from inputfile %s\n"
            "user-changeable settings:\n"
            "shift = %d bins\tfraction = %le\tthreshold=%le V\n"\
            "timing method=%2d\n"
            "report on single files to follow\n\n",
      gParms.Outputfile,gParms.Inputfile,
      gParms.Shift,gParms.Fraction,gParms.Threshold,gParms.timing); 
  extr_parameters=parameter_collection(gParms);
  limits.limits_active=LIMITS_INACTIVE;

/*** if switch -X  or -x  ****/

  if((gParms.TekwithCapHeader ==1)||(gParms.TekwithSmallHeader ==1))
  {
  /* treat the Tektronix file */
    while(!feof(listfp)){
      fgets(tekfilename,256,listfp);
      if(feof(listfp)) continue;
      if(tekfilename[strlen(tekfilename)-1]=='\n')
        tekfilename[strlen(tekfilename)-1]='\0';

#ifdef DEBUG
    printf("  *starting treating file %s\n",tekfilename);
#endif  

      subroutine_return_value=treat_tek_file(tekfilename, tekheaderfilename, 
                              outfp,extr_parameters,logfp,limits,
                              shot_number, &number_of_signals_in_shot, &number_of_shots);    


    /* does everything, or should do so at least ;-) */
    /* but now handle the return_value !!! */

    /* next sum the statistics, once it is returned by treat_lecroy_file */

      if(number_of_signals_in_shot>0){
        shot_number += number_of_shots;
        number_of_signals_total+=number_of_signals_in_shot;
      }
    }
  }
  else
  {

  /* treat LeCroy file */
    while(!feof(listfp)){
      fgets(lecroyfilename,256,listfp);
      if(feof(listfp)) continue;
      if(lecroyfilename[strlen(lecroyfilename)-1]=='\n')
        lecroyfilename[strlen(lecroyfilename)-1]='\0';

#ifdef DEBUG
    printf("  *start treating file %s\n",lecroyfilename);
#endif
    subroutine_return_value=treat_lecroy_file(lecroyfilename,outfp,extr_parameters,logfp,limits,
                                              shot_number, &number_of_signals_in_shot);
    /* does everything, or should do so at least ;-) */
    /* but now handle the return_value !!! */

    /* next sum the statistics, once it is returned by treat_lecroy_file */
      if(number_of_signals_in_shot>0){
        shot_number++;
        number_of_signals_total+=number_of_signals_in_shot;
      }

    }


  }
  fclose(outfp);
  fclose(logfp);
  printf("\n");
}






/* **********************************8 subroutines ****************************************8 */




int getArgs(int argc,char **argv)
{  char opt;
   int back=0; 

   int usage(char *);

   if(argc==1) usage(argv[0]);

//   while ((opt = (char)getopt(argc,argv,"hi:o:f:g:b:p:c:t:u:s:xX")) !=EOF)
   while ((opt = (char)getopt(argc,argv,"hi:o:t:f:b:e:xX")) !=EOF)
   {
      switch(opt)
      {
      case 'h': usage(argv[0]); break;
      case 'i': strcpy(gParms.Inputfile,optarg); break;
      case 'o': strcpy(gParms.Outputfile,optarg); break;
      case 't': gParms.Threshold=-fabs((double)atof(optarg)); break;
      case 'f': gParms.Fraction=(double)atof(optarg); break;
      case 'b': gParms.Shift=atoi(optarg); break;
      case 'e': gParms.timing=atoi(optarg); break;
      case 'x': gParms.TekwithSmallHeader=1; break;
      case 'X': gParms.TekwithCapHeader=1; break;
    /*      case 'f': gParms.Minimum_efficiency=(double)atof(optarg); break; */
      case '?': back=-1; break; /* to return error */
      }
   }
   return(back);
}


int usage(char *programm)
{  fprintf(stderr,
           "\n usage: %s  \n\n"
           "        -h             usage\n"
           "        -i [filename] inputfile             Def: infile.dat\n"
           "        -o [filename] outputfile            Def: outfile.times\n"
           "        -t [double]   Threshold             Def:  -8.  V   \n"
           "        -f [double]   Fraction              Def:  0.5    \n"
           "        -b [int]      Shift in bin          Def:  4  \n"
           "        -e [int]      Timestamps extraction Def:  1 \n"
           "        -x,X          for Tektronix format  \n\n"
       "  inputfile is one file containing a list of LeCroy or Tektornix Datafiles\n"
       "  outputfile contains timestamps in ns, shots separated by blank line\n"
       "  in addition a log-file (outputfile.log) is created\n"
       "  options t is the threshold, in fact threshold*sigma(of noise) is the threshold\n"
           "  For tektronix data (high sampling rate >= 20Gs/s):  \n"
           "      -t: threshod, actual threshold is: threshold*sigma \n"
           "      -e: timing method. 1=extraploation to zero (by linear fit), 2=cfd (by linear fit).\n"
           "      -X, -x respectively correspond to *.WFD and *.wfd(header file),however, in my case  \n" 
           "      this does not matter, and the present version can deal with the header automatically \n"
           "  For LeCroy data (low sampling rate < 20 Gs/s): \n"
           "      -t: threshod, actual threshold is: threshold*sigma \n"
           "      -f: fraction,  \n"
           "      -b: shift in bin, \n"
           "      time stamp discriminator: normal cfd, \n"           
       "  Last modified 2008.10 Baohua Sun \n\n",
           programm);
   exit(-1);
}


Makefile 见上 输出Linux:

gcc -Wall -g -o extract_timestamps extract_timestamps.c filename_treatment.o \
                   basic_analysis.o collection.o read_lecroy_file.o read_tek_file.o stamp_handling.o \
                       treat_lecroy_file.o treat_tek_file.o save_timestamps.o injection_statistics.o \
               calc_time_stamp.o peak_finding.o get_timestamps.o; chmod go+rx extract_timestamps -lm
extract_timestamps.c:37:1: Warnung: Rückgabetyp ist auf »int« voreingestellt [-Wreturn-type]
extract_timestamps.c: In Funktion »main«:
extract_timestamps.c:59:3: Warnung: Implizite Deklaration der Funktion »getArgs« [-Wimplicit-function-declaration]
extract_timestamps.c:93:7: Warnung: Implizite Deklaration der Funktion »treat_tek_file« [-Wimplicit-function-declaration]
extract_timestamps.c:122:5: Warnung: Implizite Deklaration der Funktion »treat_lecroy_file« [-Wimplicit-function-declaration]
extract_timestamps.c:38:7: Warnung: Variable »subroutine_return_value« gesetzt, aber nicht verwendet [-Wunused-but-set-variable]
extract_timestamps.c:140:1: Warnung: Kontrollfluss erreicht Ende von Nicht-void-Funktion [-Wreturn-type]
basic_analysis.o: In function `get_baseline':
basic_analysis.c:(.text+0x7b): undefined reference to `pow'
basic_analysis.c:(.text+0x216): undefined reference to `sqrt'
basic_analysis.c:(.text+0x241): undefined reference to `pow'
basic_analysis.c:(.text+0x263): undefined reference to `sqrt'
basic_analysis.o: In function `get_tek_baseline':
basic_analysis.c:(.text+0x2fb): undefined reference to `pow'
basic_analysis.c:(.text+0x496): undefined reference to `sqrt'
basic_analysis.c:(.text+0x4c1): undefined reference to `pow'
basic_analysis.c:(.text+0x4e3): undefined reference to `sqrt'
read_tek_file.o: In function `read_tek_data':
read_tek_file.c:(.text+0x362): undefined reference to `pow'
calc_time_stamp.o: In function `fitline':
calc_time_stamp.c:(.text+0x165): undefined reference to `sqrt'
calc_time_stamp.o: In function `timestamp_line':
calc_time_stamp.c:(.text+0x323): undefined reference to `sqrt'
calc_time_stamp.c:(.text+0x349): undefined reference to `sqrt'
calc_time_stamp.o: In function `timestamp_parabola1':
calc_time_stamp.c:(.text+0xc28): undefined reference to `sqrt'
calc_time_stamp.o: In function `timestamp_parabola2':
calc_time_stamp.c:(.text+0x1063): undefined reference to `pow'
calc_time_stamp.c:(.text+0x107f): undefined reference to `pow'
calc_time_stamp.c:(.text+0x10f2): undefined reference to `pow'
calc_time_stamp.c:(.text+0x116f): undefined reference to `pow'
calc_time_stamp.c:(.text+0x12a8): undefined reference to `sqrt'
calc_time_stamp.c:(.text+0x12e9): undefined reference to `sqrt'
calc_time_stamp.c:(.text+0x1333): undefined reference to `sqrt'
calc_time_stamp.c:(.text+0x1364): undefined reference to `sqrt'
calc_time_stamp.c:(.text+0x13c5): undefined reference to `sqrt'
calc_time_stamp.o:calc_time_stamp.c:(.text+0x144e): more undefined references to `sqrt' follow
collect2: ld gab 1 als Ende-Status zurück
chmod: Ungültige Option -- l
„chmod --help“ gibt weitere Informationen.
make: *** [extract_timestamps] Fehler 1

输出窗口:

gcc -lm -o extract_timestamps.exe basic_analysis.c calc_time_stamp.c collection.c extract_timestamps.c filename_treatment.c get_timestamps.c injection_statistics.c peak_finding.c read_lecroy_file.c read_tek_file.c save_timestamps.c stamp_handling.c treat_lecroy_file.c treat_tek_file.c  -O3 
filename_treatment.c: In Funktion »separate_filename«:
filename_treatment.c:23:26: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strrchr« [standardmäßig aktiviert]
filename_treatment.c:25:7: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcpy« [standardmäßig aktiviert]
filename_treatment.c:28:11: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strlen« [standardmäßig aktiviert]
filename_treatment.c:32:5: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strncpy« [standardmäßig aktiviert]
filename_treatment.c:36:11: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strlen« [standardmäßig aktiviert]
filename_treatment.c:40:5: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strncpy« [standardmäßig aktiviert]
filename_treatment.c: In Funktion »make_tek_header_filename«:
filename_treatment.c:73:13: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strlen« [standardmäßig aktiviert]
filename_treatment.c:75:3: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcpy« [standardmäßig aktiviert]
filename_treatment.c:77:20: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strrchr« [standardmäßig aktiviert]
filename_treatment.c:80:7: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]
filename_treatment.c:90:6: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]
filename_treatment.c:100:8: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]
filename_treatment.c:104:8: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]
read_lecroy_file.c: In Funktion »read_lecroy_header«:
read_lecroy_file.c:55:6: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strlen« [standardmäßig aktiviert]
read_lecroy_file.c:59:3: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcpy« [standardmäßig aktiviert]
read_lecroy_file.c:69:3: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]
read_lecroy_file.c:134:8: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strncpy« [standardmäßig aktiviert]
read_lecroy_file.c: In Funktion »read_lecroy_data«:
read_lecroy_file.c:153:3: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcpy« [standardmäßig aktiviert]
read_lecroy_file.c:154:3: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]
read_tek_file.c: In Funktion »read_tek_header«:
read_tek_file.c:67:7: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcpy« [standardmäßig aktiviert]
read_tek_file.c:70:11: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]
read_tek_file.c:73:7: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strcat« [standardmäßig aktiviert]

编辑: 执行 windows/linux 可执行文件的问题是我使用 windows 将文件列表作为输入文件。该程序有一个简单的文件名列表供搜索。但是,C 不喜欢 \r\n,而只喜欢 \n,因此它随机出现在数字和文件名的尾随 \r 的位置。 Windows makefile 正在工作,而 linux-makefile 已过时并且文件顺序错误等。

【问题讨论】:

  • 您应该播种 C 代码,并使用 gcc -Wall -g 即使用 CFLAGS= -Wall -g 编译它(在 Linux 上);使用this example 并根据您的需要进行调整。然后学习如何使用gdb 调试器。
  • 您也可以尝试将您的 Makefile 转换为CMake。完成此操作后,您可以为 Visual Studio 或CMake generator 支持的任何其他 IDE 生成解决方案。
  • @BasileStarynkevitch 感谢您的评论!我在$(COMPILER_OPT) 参数中添加了-Wall 和-g,但并没有真正改变。我还在命令行中直接使用了makefile中的主要gcc命令,使用参数-lm -O3 -g -Wall,但结果保持不变。据我了解gdb,它需要先有一个编译文件才能运行,所以没有可执行文件我无法正确启动它。还是我误解了你的建议?
  • 显示你的 C 源代码,准确的 Makefile,make 命令的输出。
  • @BasileStarynkevitch 我在上面添加了主 c 文件和 windows 和 ubuntu 的输出!

标签: c linux windows ubuntu makefile


【解决方案1】:

您的 Linux Makefile 错误(它将 -lm 传递给 chmod 命令,但 -lm 应该作为链接 gcc 命令的最后一个参数传递)。请记住,gcc 的程序参数顺序很重要。

你真的不需要chmod 命令,如果你这样做了,它应该在Makefile 的单独行中

您应该运行一次make -p 以了解make 已知的内置规则是什么。

试试类似的东西

 CC= gcc
 CFLAGS= -g -Wall
 LDLIBS= -lm
 SOURCES=  extract_timestamps.c filename_treatment.c basic_analysis.c \
           collection.c read_lecroy_file.c read_tek_file.c \
           stamp_handling.c treat_lecroy_file.c treat_tek_file.c \
           save_timestamps.c injection_statistics.c calc_time_stamp.c \
                    peak_finding.c get_timestamps.c
 OBJECTS= $(patsubst %.c, %.o, $(SOURCES))
 .PHONY: all clean

 all: extract_timestamps

 extract_timestamps: $(OBJECTS)
      $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

 ## add or autogenerate rules for object files.

在适当的时候用单个 tab 字符替换上面的多个空格。

上面的Makefile还是不完整的。您需要完成它(并且您需要一个clean 目标)。见this example。您可能需要:

 %.o: %.c time_ext.h

顺便说一句,我不建议在您的情况下使用像 cmake 这样的 Makefile 生成器。你的程序很简单,可以由一个普通的Makefile 构建

通过 GUI 编译是一个坏习惯(您可以在 emacs 中尝试 M-x compile):GUI 工具正在运行命令来构建您的程序,并将它们隐藏给您。因此,当出现问题时,您会变得无助。熟悉 Linux 命令,它们很有帮助!

Windows 和 Linux 可执行文件之间的不同行为(对于相同的源代码)可能有很多原因:undefined behavior,不同的实现方式floating point - 实现不仅取决于处理器,还取决于操作系统-,不同的x86 calling conventions,不同的编译器版本。编写portable 代码是一门高难度的艺术。

改进您的代码,直到您没有收到来自编译器的警告和错误(例如使用gcc -Wall)

【讨论】:

  • 对于一个体面的跨平台构建系统来说,没有任何项目太小。
  • 大多数项目可能不是跨平台的。我从来没有任何跨平台项目(我只使用 Linux,我只关心 Linux - 从 1994 年开始使用它;我从未使用过 Windows)
  • 仍然不是手工制作 Makefile 的理由。此外,这个问题专门针对跨平台开发。另外,恭喜您没有使用 Windows。我一直想知道为什么人们觉得他们需要提及那种细节。平台比 Windows 和 Linux 多。
  • GNU make 文档专门解释了如何“手工制作”Makefile。我不明白为什么它总是错的。 (我同意可以找到比make 更好的构建器)。
  • 感谢您的回复!我尝试在链接示例中添加%.o: %.c time_ext.h $(LINK.c) $^ $(LDLIBS) $(CFLAGS) -o $@ 等,但即使在您在此处发布的代码中,make 告诉我第 15 行,即您的最后一行,缺少限制字符(“Begrenzungszeichen”)... 原始 linux makefile 也曾在 linux 中的某个时候工作过,因为这个程序之前是正确编译的,只是不是我在我的机器上编译的......它是否有可能使用附加参数或使用不同的命令“成功”编译?
猜你喜欢
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2020-12-11
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多