在给定的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 ++项目的入口点已经过时了。
那么还有另一种方法可以更改项目的主要内容吗?
预先感谢您的帮助
答案 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
进行编译。瞧!