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)
-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
コードを実装する場合にのみ使用されます。
-shared
をコンパイルするときは、.so
リンクオプションを使用する必要があります
Boostを使用して新しいテストプロジェクトをビルドしようとすると同様の結果が得られ、1つの宣言が欠落していることがわかりました。
#define BOOST_TEST_MODULE <yourtestName>
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