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
的使用应该不会对链接器产生任何影响。