icpc编译程序的分段错误

Posted

技术标签:

【中文标题】icpc编译程序的分段错误【英文标题】:Segmentation fault on icpc-compiled program 【发布时间】:2016-07-18 18:26:49 【问题描述】:

在尝试运行 icpc 编译的程序时,我无法理解收到的分段错误。

一个简单的例子包含以下文件:

// Filename: include/lib1.h
#include <string>

namespace Lib1 
  // Template initialization, T: int, double
  template< typename T>
    T function1( T x, T y );

  // Give me the version
  std::string VERSION(void);

// Filename: include/lib2.h
#include <string>

namespace Lib2 
  // Give me the version
  std::string VERSION(void);

// Filename: src/main.cpp
#include <iostream>
#include <string>

#include "lib1.h"
#include "lib2.h"

int main( int argc, char* argv[] ) 
  std::cout << "Lib1::VERSION() :" << Lib1::VERSION()
            << std::endl;
  std::cout << "Lib2::VERSION() :" << Lib2::VERSION()
            << std::endl;

  double x = 1., y = 2.;

  std::cout << "Lib1::function1(x, y): "
            << Lib1::function1(x, y)
            << std::endl;

  return 0;

// Filename: src/lib1/lib1.cpp
#include <string>

#include "lib1.h"

template< typename T >
T Lib1::function1( T x, T y ) 
  return x * y;


std::string Lib1::VERSION(void) 
  return std::string("v0.0.2");


// Instantiation for dynamic library
template double Lib1::function1(double, double);
template int Lib1::function1(int, int);
// Filename: src/lib2/lib2.cpp
#include <string>

#include "lib2.h"

std::string Lib2::VERSION(void) 
  return std::string("v0.0.1");

在这个简单而愚蠢的例子中,当我编译文件时使用

clang++ -Wall -c -fPIC -I include -o liblib1.o src/lib1/lib1.cpp
clang++ -Wall -shared -o liblib1.so liblib1.o
clang++ -Wall -c -fPIC -I include -o liblib2.o src/lib2/lib2.cpp
clang++ -Wall -shared -o liblib2.so liblib2.o
clang++ -Wall -o main.out -I include -L ./ -llib1 -llib2 src/main.cpp

程序运行良好(前提是我正确修改了我的LD_LIBRARY_PATH环境变量。但是,当我使用时

icpc -Wall -c -fPIC -I include -o liblib1.o src/lib1/lib1.cpp
icpc -Wall -shared -o liblib1.so liblib1.o
icpc -Wall -c -fPIC -I include -o liblib2.o src/lib2/lib2.cpp
icpc -Wall -shared -o liblib2.so liblib2.o
icpc -Wall -o main.out -I include -L ./ -llib1 -llib2 src/main.cpp

然后程序给我:

[1]    27397 segmentation fault (core dumped) LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./main.out

如果您能帮助我理解并解决这个问题,我将不胜感激。当我在网上做一些研究时,我遇到了一些关于内存访问问题等的消息来源,但我现在没有做任何花哨的事情。此外,我尝试使用ddd(我在gdb 中不流利/良好)并在那里运行程序,但是程序在程序启动后立即存在段错误。我什至无法跟踪程序(是的,在运行ddd 之前,我使用了-debug -g 开关)。

【问题讨论】:

[FWIW] templates need to be defined in the header file 我很抱歉@NathanOliver,但我无法理解这个问题。在提供的链接中,解决方案完全与我在提供上述示例时所做的相同。 【参考方案1】:

碰巧Intel Parallel Studio v16.0.3 在Ubuntu 和Arch Linux 平台上存在(已知)问题,不幸的是,这些系统也没有得到官方支持。

一个快速的解决方法似乎是现在降级到 v16.0.2

【讨论】:

以上是关于icpc编译程序的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

“程序中出现访问冲突(分段错误)。”

我的 Vigenere 加密程序中的分段错误

为啥我得到以下程序的分段错误?

一个简单的 qt 程序未运行并显示“分段错误”的错误消息

该程序中的分段错误是啥

icpc 无法打开源文件“bits/c++config.h”错误