0

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中声明函数,怎么写?

4

1 回答 1

0

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

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

所以我猜你要么声明void MyFunction();as ,extern "C"要么实际上是main.o通过编译main.cusinggcc而不是main.cpp.

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

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

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

如果它们都被破坏,但不同,那么你在两种情况下都以不同的方式声明了函数。

的使用#define根本不应该影响链接器。

于 2012-08-02T04:42:35.997 回答