2015-08-24 2 views
0

У меня есть GCC 5.2.0 настроен следующим образом:г ++ неопределенная ссылка на `главный

Using built-in specs. 
COLLECT_GCC=gcc-5.2.0 
COLLECT_LTO_WRAPPER=/usr/local/lvm/gcc-5.2.0/libexec/gcc/x86_64-unknown-linux-gnu/5.2.0/lto-wrapper 
Target: x86_64-unknown-linux-gnu 
Configured with: ../configure --prefix=/usr/local/lvm/gcc-5.2.0 --enable-checking=release --with-gmp=/usr/local/lvm/gmp-6.0.0 --with-mpfr=/usr/local/lvm/mpfr-3.1.2 --with-mpc=/usr/local/lvm/mpc-1.0.3 --enable-languages=c,c++,fortran,objc,obj-c++ --with-isl=/usr/local/lvm/isl-0.14 --with-cloog=/usr/local/lvm/cloog-0.18.4 --program-suffix=-5.2.0 
Thread model: posix 
gcc version 5.2.0 (GCC) 

и г ++:

Using built-in specs. 
COLLECT_GCC=g++-5.2.0 
COLLECT_LTO_WRAPPER=/usr/local/lvm/gcc-5.2.0/libexec/gcc/x86_64-unknown-linux-gnu/5.2.0/lto-wrapper 
Target: x86_64-unknown-linux-gnu 
Configured with: ../configure --prefix=/usr/local/lvm/gcc-5.2.0 --enable-checking=release --with-gmp=/usr/local/lvm/gmp-6.0.0 --with-mpfr=/usr/local/lvm/mpfr-3.1.2 --with-mpc=/usr/local/lvm/mpc-1.0.3 --enable-languages=c,c++,fortran,objc,obj-c++ --with-isl=/usr/local/lvm/isl-0.14 --with-cloog=/usr/local/lvm/cloog-0.18.4 --program-suffix=-5.2.0 
Thread model: posix 
gcc version 5.2.0 (GCC) 

У меня есть следующий простой C++ код в файле tmp2.cpp :

extern "C" { 
     double mysum(double x, double y) 
     { 
      return x+y; 
     } 
} 

, что я пытаюсь скомпилировать в динамическую библиотеку (.so) следующим образом:

export LD_LIBRARY_PATH=/usr/local/lvm/gmp-6.0.0:/usr/local/lvm/mpfr-3.1.2:/usr/local/lvm/mpc-1.0.3:/usr/local/lvm/cloog-0.18.4:/usr/local/lvm/isl-0.14/lib:/usr/local/lvm/gcc-5.2.0/lib64 
export PATH=/usr/local/lvm/gcc-5.2.0/bin/:$PATH 
g++-5.2.0 -m32 -Wall -g -c ./tmp2.cpp 
g++-5.2.0 -m32 -dynamiclib ./tmp2.o -o ./tmp2.so 

и последняя команда дает мне следующую ошибку:

/usr/lib/../lib32/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: error: ld returned 1 exit status 

Выход ТНХ деталь к -v можно найти в GIST here.

Я новичок в gcc/g ++ и не понимаю, что происходит. Что случилось ?

+1

Попробуйте '-o ./tmp2.so -shared'. –

+0

Thx много для правильного варианта! –

+0

Место не имеет значения, вам просто нужно использовать '-shared' сказать GCC, что вы создаете общую библиотеку, иначе она думает, что вы создаете исполняемый файл, который требует функции' main'. –

ответ

1

Вы должны использовать -shared вариант g ++ для создания общего объекта.

g++-5.2.0 -m32 -shared -dynamiclib ./tmp2.o -o ./tmp2.so