在不使用-nostartfiles选项的情况下更改C ++项目的主体

时间:2018-12-08 05:14:18

标签: c++ gcc compilation linker

在给定的C ++项目上,我正在尝试将主体更改为newEntry.cpp:

void entry(){
...
}

根据一些在线帖子,您应该使用以下链接器选项:

-e entry newEntry.cpp -nostartfiles

-e“符号”“文件”将新的主文件提供给链接器,而-nostartfiles忽略crt *文件,因此它不提供实际的主文件。

问题在于crt。*中定义了一个隐藏的符号_dso_handler,因此通过使用这种方法,您最终会遇到以下错误:

/usr/include/c++/4.7/iostream:75: undefined reference to `__dso_handle'

-nostartfiles在这里引起新问题。我该如何解决?
我可以尝试提供_dso_handle(我不知道如何提供),但是我怀疑由于省略了crt *文件这一事实而产生了新的错误。我读过一些文章,今天说使用-nostartfiles更改C / C ++项目的入口点已经过时了。

那么还有另一种方法可以更改项目的主要内容吗?

预先感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我刚发现最肯定的解决方案是:使用ld来包装 main,demo:

#include <iostream>

extern "C" int __real_main(int argc,char* argv[]);//other name for main
extern "C" int __wrap_main(int argc,char* argv[]){//called in place of main
   std::cout << "Executing " << argv[0] << std::endl;
   int ret = __real_main(argc,argv);
   std::cout << "main returned " << ret << std::endl;
   return ret;
   }
 int main(int argc,char* argv[]){
   std::cout << "Main execution" << std::endl;
   return 42;
   }

使用--wrap=main和链接器选项c++ -Wl,--wrap=main file.cpp进行编译。瞧!

Live demo