2013-08-15 3 views
0

Я не понимаю флаг g ++ -c. на основе определения: Скомпилируйте или соберите исходные файлы, но не связывайтесь. Шаг связывания просто не выполняется. Конечный результат представлен в виде объектного файла для каждого исходного файла. Мне нужна помощь, чтобы понять причину ошибки для следующего процесса сборки. Thanksошибка сборки, связанная с g ++ -c флагом

Я пытаюсь скомпилировать программу helloworld образца в затмении.

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "Hello World!"; 
    return 0; 
} 

без -c. затмение дает мне сообщение об ошибке:

make all 
Building file: ../app.cpp 
Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -fmessage-length=0 -fPIC -MMD -MP -MF"app.d" -MT"app.d" -o "app.o" "../app.cpp" 
Finished building: ../app.cpp 

Building target: app.so 
Invoking: GCC C++ Linker 
g++ -shared -o "app.so" ./app.o 
./app.o: In function `_fini': 
(.fini+0x0): multiple definition of `_fini' 
/usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../../../lib64/crti.o:(.fini+0x0): first defined here 
./app.o: In function `_init': 
(.init+0x0): multiple definition of `_init' 
/usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../../../lib64/crti.o:(.init+0x0): first defined here 
/usr/lib/gcc/x86_64-redhat-linux/4.6.3/crtendS.o:(.dtors+0x0): multiple definition of `__DTOR_END__' 
./app.o:(.dtors+0x8): first defined here 
/usr/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored. 
/usr/bin/ld: error in ./app.o(.eh_frame); no .eh_frame_hdr table will be created. 
collect2: ld returned 1 exit status 
make: *** [app.so] Error 1 

11:25:49 Build Finished (took 463ms) 

с -c, то строить отлично:

11:33:16 **** Incremental Build of configuration Debug for project app **** 
make all 
Building file: ../app.cpp 
Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fPIC -MMD -MP -MF"app.d" -MT"app.d" -o "app.o" "../app.cpp" 
Finished building: ../app.cpp 

Building target: app.so 
Invoking: GCC C++ Linker 
g++ -shared -o "app.so" ./app.o 
Finished building target: app.so 

11:33:16 отделка (взял 311ms)

нового исправления для создания исполняемого файла

13:32:44 **** Incremental Build of configuration Debug for project app **** 
make all 
Building file: ../app.cpp 
Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fPIC -MMD -MP -MF"app.d" -MT"app.d" -o "app.o" "../app.cpp" 
Finished building: ../app.cpp 

Building target: app 
Invoking: GCC C++ Linker 
g++ -shared -o "app" ./app.o 
Finished building target: app 
+0

В качестве бокового узла общая библиотека не должна содержать функцию main(). Обычно вы создаете функцию main() в своем приложении и связываете библиотеки в других целях. – nos

+0

Oop, я просто нашел, что я установил его в режиме общей библиотеки случайно – cppython

ответ

2

В вашем первом случае без -c, ваш первый вызов g ++ генерирует полностью связанный исполняемый файл, вводящий в заблуждение под названием «app.o ». (Попробуйте ввести «файл ./app.o», чтобы описать файл в обоих случаях. Это может быть интересно.) Вы сможете запустить его. (Тип ./app.o)

С флагом -c этот вызов g ++ генерирует только код объекта, а -, подходящий для дальнейшего этапа ссылки (как вы заметили).

+0

Я исправил это приложение app.o в исполняемом файле приложения. спасибо, но я до сих пор не понимаю, почему мы не можем скомпилировать без флага -c. – cppython

+0

Я рекомендую вам прочитать что-то вроде этого: http://pages.cs.wisc.edu/~beechung/ref/gcc-intro.html –

+0

Я обнаружил, что это неправильно на Eclipse. Я могу скомпилировать программу с помощью командной строки Makefile. если я не набрал -c, программа дает мне только объектный файл, который соответствует определению в руководстве g ++. в eclipse, я не знаю, почему он не остановился после получения объекта. он переходит на этап ссылки и генерирует ошибку. – cppython

Смежные вопросы