g++链接错误:使用#define编写函数名称时,未定义对函数的引用



function.cpp->它被编译为function.o,然后是libFunction.so

#define PASTEHELPER(a,b) a ## b
#define PASTE(a,b) PASTEHELPER(a,b)
void PASTE(My,Function)() { .... }

main.cpp->编译到main.o,但链接时出错

void MyFunction();

g++中的链接错误。(但是,在Visual Studio中取得了成功)

g++ -mtune=i686 -MP -MMD -MT .o -Wextra -Woverloaded-virtual -Wno-sign-compare -Wno-conversion -Wno-missing-field-initializers -O3 -DNDEBUG -fno-strict-aliasing -fPIC -fdiagnostics-show-option -DPROJECT=MyProjec  -o /mypath  main.o -L..  -L/sbcimp/run/pd/gcc/32-bit/4.4.2/lib/gcc/i686-pc-linux-gnu/4.4.2 -L/sbcimp/run/pd/gcc/32-bit/4.4.2/lib -lFunction -pthread -L/sbcimp/run/pd/python/2.7.1/lib -lpython2.7 -l util  -L/sbcimp/run/pd/boost/32-bit/1.47.0_gcc4.4.2/lib -lboost_filesystem -lboost_thread -lboost_regex -lboost_system -Wl,-rpath,/sbcimp/run/pd/boost/32-bit/1.47.0_gcc4.4.2/lib -L/sbcimp/run/pd/apache_xerces-c/32-bit/3.1.1_mt_gcc4.4.2/lib -lxerces-c -Wl,-rpath,/sbcimp/run/pd/apache_xerces-c/32-bit/3.1.1_mt_gcc4.4.2/lib -ldl -Wl,-z,origin -Wl,-rpath,'$ORIGIN' -Wl,-rpath,/sbcimp/run/pd/gcc/32-bit/4.4.2/lib/gcc/i686-pc-linux-gnu/4.4.2,-rpath,/sbcimp/run/pd/gcc/32-bit/4.4.2/lib,-soname,MyProject

main.cpp: undefined reference to 'MyFunction'. 

该函数未在任何.h文件中定义。这是问题所在吗?如果需要在.h中声明函数,如何编写?

我不确定粘贴的链接器错误是否完整。

但是无论如何,如果链接器真的抱怨MyFunction,那么它期望符号MyFunction是C,而不是C++(在C++中,它应该抱怨MyFunction())。

所以我猜您要么将void MyFunction();声明为extern "C",要么实际上通过使用gcc而不是main.cpp编译main.c来获得main.o

您可以通过运行来检查库中的内容以及链接器所期望的内容

objdump -t function.o |grep MyFunction
objdump -t main.o |grep MyFunction

如果您从.cpp文件编译了这两个.o文件,则应该获得类似_Z10MyFunctionv的符号名称。两者的符号名称应相同。但如果其中一个没有被破坏(即只是MyFunction),那么它来自C,而不是C++。

如果它们都被破坏了,但不同,那么您在这两种情况下声明的函数就不同了。

#define的使用应该不会对链接器产生任何影响。

最新更新