2017-03-07 99 views
1

我想用C編寫一個多平臺的本地桌面應用程序。經過一番搜索之後,我發現IUP是最合適的。不幸的是,我在努力鏈接Windows SDK。目前,我只想靜態編譯Windows 8.1的x64版本。當我編譯代碼::塊this例子,我得到以下錯誤:IUP - Windows SDK靜態鏈接

g++.exe -LC:\MinGW\iup -o "bin-debug\EVE Editor.exe" obj-debug\main.o -lgdi32 -luser32 -lkernel32 -lcomctl32 -lole32 -lfreetype6 -liup -liup_mglplot -liup_plot -liup_scintilla -liupcd -liupcontrols -liupgl -liupglcontrols -liupim -liupimglib -liupmatrixex -liupole -liuptuio -lz 
C:\MinGW\iup/libiup.a(iupwin_font.o):iupwin_font.c:(.text+0x1db): undefined reference to `__imp_CreateFontW' 
C:\MinGW\iup/libiup.a(iupwin_font.o):iupwin_font.c:(.text+0x224): undefined reference to `__imp_SelectObject' 
C:\MinGW\iup/libiup.a(iupwin_font.o):iupwin_font.c:(.text+0x240): undefined reference to `__imp_GetTextMetricsW' 
C:\MinGW\iup/libiup.a(iupwin_font.o):iupwin_font.c:(.text+0x684): undefined reference to `__imp_SelectObject' 
C:\MinGW\iup/libiup.a(iupwin_font.o):iupwin_font.c:(.text+0x734): undefined reference to `__imp_GetTextExtentPoint32W' 

等等等等。 Here IUP文檔中提到:「對於Windows,如果您將應用程序靜態鏈接到IUP,則還必須鏈接庫(與編譯器一起提供)中的ole32.lib和comctl32.lib庫。」所以我從here獲得了Windows SDK,並使用ole32和comctl32進行了重新編譯。我得到了同樣的錯誤。我也在同一頁面上查看了Code :: Blocks指南,但它是用於動態鏈接的。

我從來沒有聯繫過Windows SDK,所以我很茫然。這是我的Code :: Blocks項目:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<CodeBlocks_project_file> 
    <FileVersion major="1" minor="6" /> 
    <Project> 
     <Option title="EVE Editor" /> 
     <Option pch_mode="2" /> 
     <Option compiler="gcc" /> 
     <Build> 
      <Target title="Debug"> 
       <Option output="bin-debug/EVE Editor" prefix_auto="1" extension_auto="1" /> 
       <Option object_output="obj-debug/" /> 
       <Option type="1" /> 
       <Option compiler="gcc" /> 
       <Compiler> 
        <Add option="-g" /> 
       </Compiler> 
      </Target> 
      <Target title="Release"> 
       <Option output="bin/EVE Editor" prefix_auto="1" extension_auto="1" /> 
       <Option object_output="obj/" /> 
       <Option type="0" /> 
       <Option compiler="gcc" /> 
       <Compiler> 
        <Add option="-O2" /> 
       </Compiler> 
       <Linker> 
        <Add option="-s" /> 
       </Linker> 
      </Target> 
     </Build> 
     <Compiler> 
      <Add option="-Wall" /> 
      <Add directory="C:/MinGW/iup/include" /> 
     </Compiler> 
     <ResourceCompiler> 
      <Add directory="C:/MinGW/iup/etc" /> 
     </ResourceCompiler> 
     <Linker> 
      <Add library="gdi32" /> 
      <Add library="user32" /> 
      <Add library="kernel32" /> 
      <Add library="comctl32" /> 
      <Add library="ole32" /> 
      <Add library="libfreetype6.a" /> 
      <Add library="libiup.a" /> 
      <Add library="libiup_mglplot.a" /> 
      <Add library="libiup_plot.a" /> 
      <Add library="libiup_scintilla.a" /> 
      <Add library="libiupcd.a" /> 
      <Add library="libiupcontrols.a" /> 
      <Add library="libiupgl.a" /> 
      <Add library="libiupglcontrols.a" /> 
      <Add library="libiupim.a" /> 
      <Add library="libiupimglib.a" /> 
      <Add library="libiupmatrixex.a" /> 
      <Add library="libiupole.a" /> 
      <Add library="libiuptuio.a" /> 
      <Add library="libz.a" /> 
      <Add directory="C:/MinGW/iup" /> 
     </Linker> 
     <Unit filename="main.c"> 
      <Option compilerVar="CC" /> 
     </Unit> 
     <Extensions> 
      <code_completion /> 
      <envvars /> 
      <debugger /> 
      <lib_finder disable_auto="1" /> 
     </Extensions> 
    </Project> 
</CodeBlocks_project_file> 

回答

2

嘗試更改鏈接完成的順序。依賴順序必須顛倒,我的意思是最少依賴庫最後。例如:

 <Add library="libiupcontrols.a" /> -- optional 
     <Add library="libiupcd.a" />   -- optional 
     <Add library="libcd.a" />   -- optional 
     <Add library="libfreetype6.a" /> -- optional 
     <Add library="libz.a" /> -- optional 
     <Add library="libiup.a" /> 
     <Add library="gdi32" /> 
     <Add library="user32" /> 
     <Add library="kernel32" /> 
     <Add library="comctl32" /> 
     <Add library="ole32" /> 

而且您不需要包含所有IUP庫,只是您實際使用的庫。

+0

謝謝!原來,這是鏈接順序。如果你想編譯這個教程,你需要libiup.a,comctl32,ole32和uuid。 – DragonDePlatino