c代码在Mac中成功生成,而在Linux中失败

c代码在Mac中成功生成,而在Linux中失败,linux,macos,makefile,exit,Linux,Macos,Makefile,Exit,我有一些源文件(例如layout.cpp)。我可以在本地MAC计算机上使用“make”命令。成功制作后,我将所有文件复制到远程Linux机器。但是,我的MAC计算机中的可执行文件无法在远程Linux计算机中执行。下面是错误消息 布局不是二进制可执行文件 我认为失败是因为布局文件的格式是“Mach-O64位可执行文件”,无法在linux机器上运行 因此,我尝试在远程linux机器中生成源文件。但是,它显示了很多错误消息,如下所示 layout.cpp:75:错误:未在此作用域中声明“退出” lay

我有一些源文件(例如layout.cpp)。我可以在本地MAC计算机上使用“make”命令。成功制作后,我将所有文件复制到远程Linux机器。但是,我的MAC计算机中的可执行文件无法在远程Linux计算机中执行。下面是错误消息

布局不是二进制可执行文件

我认为失败是因为布局文件的格式是“Mach-O64位可执行文件”,无法在linux机器上运行

因此,我尝试在远程linux机器中生成源文件。但是,它显示了很多错误消息,如下所示

layout.cpp:75:错误:未在此作用域中声明“退出”

layout.cpp:88:错误:“strcpy”未在此作用域中声明

但这些错误并没有在MAC的生成过程中显示出来。这些错误是由MAC和Linux中编译器的差异造成的吗?由于存在许多不同的错误,因此我们不能简单地添加“#include cstdlib”或“#include string.h”来解决这个问题。谢谢

源代码:

#include <iostream>
#include <fstream>
#include <map>
#include <set>
#include <string>
#include <deque>
#include <vector>

using namespace std;

// layout routines and constants
#include <layout.h>
#include <parse.h>
#include <graph.h>

// MPI
#ifdef MUSE_MPI
    #include <mpi.h>
#endif

int main(int argc, char **argv) {


    // initialize MPI
    int myid, num_procs;

 #ifdef MUSE_MPI
     MPI_Init ( &argc, &argv );
     MPI_Comm_size ( MPI_COMM_WORLD, &num_procs );
     MPI_Comm_rank ( MPI_COMM_WORLD, &myid );
 #else
    myid = 0;
    num_procs = 1;
 #endif

  // parameters that must be broadcast to all processors
 int rand_seed;
 float edge_cut;

 char int_file[MAX_FILE_NAME];
 char coord_file[MAX_FILE_NAME];
 char real_file[MAX_FILE_NAME];
 char parms_file[MAX_FILE_NAME];

 int int_out = 0;
 int edges_out = 0;
 int parms_in = 0;
 float real_in = -1.0;

 // user interaction is handled by processor 0
 if ( myid == 0 )
 {
     if ( num_procs > MAX_PROCS )
     {
    cout << "Error: Maximum number of processors is " << MAX_PROCS << "." << endl;
    cout << "Adjust compile time parameter." << endl;
    #ifdef MUSE_MPI
      MPI_Abort ( MPI_COMM_WORLD, 1 );
    #else
      exit (1);
    #endif
}

// get user input
    parse command_line ( argc, argv );
rand_seed = command_line.rand_seed;
edge_cut = command_line.edge_cut;
int_out = command_line.int_out;
edges_out = command_line.edges_out;
parms_in = command_line.parms_in;
real_in = command_line.real_in;
strcpy ( coord_file, command_line.coord_file.c_str() );
strcpy ( int_file, command_line.sim_file.c_str() );
strcpy ( real_file, command_line.real_file.c_str() );
strcpy ( parms_file, command_line.parms_file.c_str() );

 }

 // now we initialize all processors by reading .int file
  #ifdef MUSE_MPI
     MPI_Bcast ( &int_file, MAX_FILE_NAME, MPI_CHAR, 0, MPI_COMM_WORLD );
  #endif
  graph neighbors ( myid, num_procs, int_file );


  // finally we output file and quit
  float tot_energy;
  tot_energy = neighbors.get_tot_energy ();
  if ( myid == 0 )
  {
   neighbors.write_coord ( coord_file );
   cout << "Total Energy: " << tot_energy << "." << endl
        << "Program terminated successfully." << endl;
  }

  // MPI finalize
 #ifdef MUSE_MPI
    MPI_Finalize ();
 #endif

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
//布局例程和常量
#包括
#包括
#包括
//MPI
#ifdef MUSE_MPI
#包括
#恩迪夫
int main(int argc,字符**argv){
//初始化MPI
int myid,num_procs;
#ifdef MUSE_MPI
MPI_Init(&argc,&argv);
MPI_通信大小(MPI_通信世界和数量进程);
MPI通信等级(MPI通信世界和myid);
#否则
myid=0;
num_procs=1;
#恩迪夫
//必须广播到所有处理器的参数
int rand_seed;
浮边切割;
char int_文件[最大文件名];
字符坐标文件[最大文件名];
char real_file[最大文件名];
char parms_file[最大文件名];
int_out=0;
int-edges_-out=0;
int parms_in=0;
浮点实数单位=1.0;
//用户交互由处理器0处理
如果(myid==0)
{
如果(num\u procs>MAX\u procs)
{

CUT

您缺少几个标准<代码> >包含标准C++头或C标题>代码> <代码>(对于代码>退出>代码>和标准C++头或C头<代码> <代码>(对于<代码> StrucP),如(也解释了为什么在MaCOSX上工作但不在Linux上工作)。 您可能应该切换到标准。这意味着安装最新的GCC(4.8)并使用

g++-std=c++11
编译,当然还有
-Wall-g
(以获取所有警告和调试信息)

您在这些问题上搜索得不够。您可以键入
man exit
获取手册页,或者键入
man strcpy
获取手册页。两个手册页都提供了相关的C include标题


顺便说一句,错误确实存在于您的源代码中。使用
exit
的代码应该明确地包含
(至少出于可读性原因)。您不应该假设其他系统头(意外地)存在错误包括这一点。

如果你需要帮助,你应该展示一些源代码……如果你的代码太草率了,以至于你没有声明退出和strcpy,你需要在Mac OS X上进行代码编译,然后再进行移植。sanly的意思是最低限度的
gcc-Wall
;我通常使用
gcc-O3-g-std=c11-Wall-Wextra-Wmissing原型-Wstrict原型-Wold样式定义-Werror
(我在Mac OS X 10.9.1和GCC 4.8.2上使用这些)当您的代码在Mac OS X上用这些选项简洁地编译时,然后考虑在别处移植。并且<代码> <代码>是不合适的,除非您真的在C++中工作,但是您不应该使用<代码> STRCYP()。完全注意!C++标准头的一个特性是它们可以相互包含。在Mac OS X上有可能包含一个头,它包括“代码> <代码> >代码> <代码>,但是Linux上的同一个标题不这样做,所以您必须相应地修改代码。请删除该标题;不要依赖其他标题来包含它。@BasileStrynkevitch我已经添加了源代码。我发现编译器已经在我的设置文件中定义。它是“g++03”。我对这个错误感到困惑。谢谢!