Вопрос по undefined-reference, linux, main – crt1.o: в функции `_start ': - неопределенная ссылка на` main' в Linux

29

Я портирую приложение с соляриса на линукс

Связанные объектные файлы не определены как main (). Но компиляция и компоновка в Solaris выполняются правильно, и исполняемый файл генерируется. В Linux я получаю эту ошибку

    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main' 

Моя проблема в том, что я не могу включить новые файлы .c / .o, поскольку это огромное приложение, которое работает уже много лет. Как я могу избавиться от этой ошибки?

Экстракты кода make-файла:

RPCAPPN = api
LINK = cc 

    $(RPCAPPN)_server: $(RPCAPIOBJ)
            $(LINK) -g $(RPCAPIOBJ) -o $(RPCAPPN)_server $(IDALIBS) $(LIBS) $(ORALIBS) $(COMMONLIB) $(LIBAPI) $(CCLIB) $(THREADLIB) $(DBSERVERLIB) $(ENCLIB)
но ctr1.o - это определенный в ОС объектный файл, представленный в / usr / lib64. Следовательно, вызов main () не может быть изменен. Blackforest
Можете ли вы опубликовать make-файл и / или фактические команды сборки? Paul R
Да .. Я добавил несколько строк из makefile. Blackforest
Все просто: либо вы перестаете называть main, либо определяете main (^). Почему он работает на солярисе? Были ли у него специальные флаги компоновщика (ссылка на общий объект?) wildplasser
Попробуйте добавить-nostartfiles к вашим параметрам компоновщика, т.е.$(LINK) -nostartfiles -g ... Paul R

Ваш Ответ

4   ответа
21

-shared опция ссылки должна использоваться при компиляции.so

Согласовано; это также помогло мне обойти проблему с компиляцией внешних функций для sqlite.
Это на самом деле помогло мне установить пакет R, который ранее не удался с ошибкой выше.
0

в UTF-8 в строковом литерале. ARM7HL, Sailfish OS, GNU C ++.

30

Попробуйте добавить-nostartfiles к вашим параметрам компоновщика, т.е.

$(LINK) -nostartfiles -g ...

Отдокументация gcc:

-nostartfiles
    Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used. 

Это вызываетcrt1.o не быть связанным (обычно это связано по умолчанию) - обычно используется только при реализации вашего собственного_start код.

Это тоже не очень хорошее решение для меня. Я получаю: / usr / bin / ld: warning: не могу найти символ ввода _start; по умолчанию 00000000004562d0 & quot; среди прочего после использования этого флага
в зависимости от проблемы, тогда это не совсем решение - у меня была похожая проблема при попытке сделать тестовый проект буста, и добавление этого флага сделало все хуже
1

с Boost, и оказалось, что я пропустил одно объявление:

#define BOOST_TEST_MODULE <yourtestName>

Похожие вопросы