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中很成功)
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中声明函数,如何编写它?
发布于 2012-08-02 04:42:35
我不确定粘贴链接器的错误是否完成。
但是无论如何,如果链接器真的抱怨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如果您从.o文件编译了这两个.cpp文件,您应该会得到像_Z10MyFunctionv这样的符号名。符号名应该是相同的。但如果他们中的一个没有被破坏(如。就是MyFunction),那么它来自C,而不是C++。
如果这两个函数都是错误的,但是不同,那么在这两种情况下,声明函数的方式都是不同的。
#define的使用根本不应该影响链接器。
https://stackoverflow.com/questions/11769968
复制相似问题