gpt4 book ai didi

在 Win8/Ubuntu 上编译 Makefile 行为不同?

转载 作者:太空宇宙 更新时间:2023-11-04 08:45:20 24 4
gpt4 key购买 nike

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

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

Windows 生成文件:

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 生成文件:

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 所安慰,这些 GUI 可以正确地编译一些东西。这可能就是为什么我在这里错过了一些基本的东西。

你能告诉我为什么 windows 可执行文件处理数字错误以及为什么我无法在 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);
}


生成文件见上输出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 生成文件正在运行,而 linux 生成文件已过时并且文件顺序错误等。

最佳答案

您的 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)

关于在 Win8/Ubuntu 上编译 Makefile 行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21883711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com