У меня возникают проблемы с пониманием ошибки сегментации, которую я получаю при попытке запуска программ, скомпилированных icpc.Ошибка сегментации в 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
программа работает нормально (при условии, что я правильно изменяю свою переменную среды . Однако, когда я использую
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
) и запускаю программу там, но программа существует с segfault сразу после запуска программы. Я даже не могу отследить программу (да, до запуска ddd
, я использовал -debug -g
переключатели).
[FWIW] [шаблоны должны быть определены в файле заголовка] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – NathanOliver
Извините, @NathanOliver, но я не мог понять проблему. В приведенной ссылке решение * точно * совпадает с тем, что я сделал при предоставлении приведенных выше примеров. –