我有一个用Visual Studio 2008编译的C++/Windows程序。该程序仅由两个.cpp文件组成。我现在正试图使用MinGW来编译和链接它。到目前为止,我已经成功地编译了这两个源文件,没有出现错误,但现在当我用命令链接它们时。。。
g++ -o program.exe file1.o file2.o
我得到了许多"未定义引用.."的例子,包括各种与图形相关的函数,如:
GetStockObject, SelectObject, MoveTo, LineTo, SetPixel, TextOut, BitBlt, CreatePen etc.
我没有得到任何其他类型的windows调用的未定义引用。很明显,我在链接器命令行中遗漏了一些内容,但无法确定是什么。
由于这跨越了之前的两个(相似的)答案,我将把它作为一个单独的答案添加,而不是作为之前答案的重复注释。
更好的做法是,与其跳进去添加"-lgdi32",不如先添加"-mwindows"选项;此选项会告诉GCC您正在构建Windows应用程序(其默认为"控制台"应用程序类型),因此会导致它自动绑定多个附加的图形设备接口特定库(其中一个是gdi32.dll)。只有在添加此选项仍然无法解决所有符号需求时,您才担心可能需要哪些其他非默认库。
所有这些函数都位于Gdi32.dll
中。您需要链接Gdi32.lib
才能使它们工作。你可以试试:
g++ -o program.exe file1.o file2.o -L MinGWlib -lgdi32
顺便说一句,微软对每个函数都进行了广泛的文档记录,并命名了相应的库。例如:GetStockObject。
您可以这样解决它:对于每个未定义的引用,请在Microsoft Developer Network文档中查找该函数。在你的情况下,谷歌
GetStockObject msdn
描述该功能的MSDN页面底部包含一节"需求"。这里列出了需要链接到的DLL。
在GetStockObject的情况下,它是Gdi32.dll
扩展您的命令行以包含-lGdi32
请重试链接,并对任何剩余的未定义引用重复此操作。