web-dev-qa-db-ja.com

crt1.o:関数「_start」:-Linuxの「main」への未定義参照

SolarisからLinuxにアプリケーションを移植しています

リンクされているオブジェクトファイルには、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ファイルを含めることができないことです。これは、その巨大なアプリケーションであり、何年も実行されているためです。このエラーを取り除くにはどうすればよいですか?

メイクファイルのコード抽出:

RPCAPPN = api
LINK = cc 

    $(RPCAPPN)_server: $(RPCAPIOBJ)
            $(LINK) -g $(RPCAPIOBJ) -o $(RPCAPPN)_server $(IDALIBS) $(LIBS) $(ORALIBS) $(COMMONLIB) $(LIBAPI) $(CCLIB) $(THREADLIB) $(DBSERVERLIB) $(ENCLIB)
30
Blackforest

-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コードを実装する場合にのみ使用されます。

33
Paul R

-sharedをコンパイルするときは、.soリンクオプションを使用する必要があります

22
user2783604

Boostを使用して新しいテストプロジェクトをビルドしようとすると同様の結果が得られ、1つの宣言が欠落していることがわかりました。

#define BOOST_TEST_MODULE <yourtestName>
2
serup

C++コンポーネントがリンクされているFortranプログラムをコンパイルした場合も、同様の結果が得られました。私の場合、CMakeはFortranを最終リンクに使用する必要があることを検出できませんでした。 makeによって返されたメッセージは、

[100%] Linking CXX executable myprogram
/lib/../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
make[3]: *** [myprogram] Error 1
make[2]: *** [CMakeFiles/myprogram.dir/all] Error 2
make[1]: *** [CMakeFiles/myprogram.dir/rule] Error 2
make: *** [myprogram] Error 2

解決策は追加することでした

set_target_properties(myprogram PROPERTIES LINKER_LANGUAGE Fortran) 

makeが出力されるようにCMakeLists.txtに:

[100%] Linking Fortran executable myprogram
[100%] Built target myprogram
0
Bastian