【发布时间】:2014-03-21 16:55:58
【问题描述】:
我有以下设置:
main.c:
extern void sol();
int main(){
sol();
}
sol.cc:
#include<iostream>
using namespace std;
void sol(){
cout<<"HW!!\n";
}
我编译为单独的目标文件:
$gcc main.c -c
$g++ sol.cc -c
但是当我尝试将它们链接到单个可执行文件时,
$g++ main.o sol.o
我得到:main.c:(.text+0x7): undefined reference to 'sol',nm sol.o 表明存在00000000 T _Z3solv,而nm main.o 需要U sol。我发现 C++ 重命名函数以避免重载函数的名称相同。有没有办法告诉编译器sol.o 包含重命名的函数,或者编译sol.cc 而不重命名它们?
【问题讨论】:
-
我认为 extern "C" 会阻止重命名发生。 IE。 extern "C" void sol(){cout
-
extern "C"en.wikipedia.org/wiki/… -
最好在混合 C 和 C++ 程序中将
main()函数设为 C++ 函数,即使它由整个int main(int argc, char **argv) { return c_main(argc, argv); }组成(声明等同于extern "C" int c_main(int argc, char **argv);在适用范围)。原来的 Cmain()被简单地重命名为c_main()— 或real_main()或任何其他你喜欢的名称。 -
非常感谢,它有效!
标签: c++ c linker ld object-files