2011-03-23 42 views
0

我SConstruct文件看起來是這樣的:如何鏈接使用靜態庫本身使用scons和Visual C++的靜態庫?

jnglLibs = Split("freetype png ogg vorbisfile") # left out a few 
env.Library(target="jngl", source=source_files, LIBS=jnglLibs) 
env.Program("test.cpp", LIBS=Split("jngl") + jnglLibs) 

靜態庫鏈接罰款,但該計劃失敗,並從jnglLibs庫無法解析的外部符號。

lib /nologo /OUT:jngl.lib finally.obj freetype.obj main.obj opengl.obj sprite.ob 
j tess.obj texture.obj window.obj windowptr.obj callbacks.obj ConvertUTF.obj aud 
io.obj win32\message.obj win32\time.obj win32\window.obj 
cl /Fotest.obj /c test.cpp /TP /nologo /EHsc /MD -O2 -DNDEBUG /I. 
test.cpp 
link /OUT:test.exe /LIBPATH:. /LIBPATH:lib jngl.lib freetype.lib png.lib opengl3 
2.lib glu32.lib user32.lib shell32.lib gdi32.lib z.lib jpeg.lib dl.lib openal32. 
lib alut.lib ogg.lib vorbisfile.lib test.obj 
Microsoft (R) Incremental Linker Version 10.00.30319.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

jngl.lib(freetype.obj) : error LNK2019: unresolved external symbol FT_Done_FreeT 
ype referenced in function "public: __cdecl jngl::Font::~Font(void)" ([email protected] 
[email protected]@[email protected]) 
... and so on 

爲什麼它找不到freetype.lib中的符號FT_Done_FreeType?它與GCC完美配合。

回答

1

在Windows上有很多靜態鏈接的怪癖。我有一個或兩個類似的問題,但主要是我的問題是一旦「靜態」庫編譯,他們仍然依賴於.dll的存在。無論如何,我現在一直在感受你的痛苦,但爲了我的目的,我已經完成了它......這是一個真正幫助我的頁面。

http://xmlsoft.org/XSLT/tutorial2/libxslt_pipes.html#windows-build

它沒有與你列出的特定庫做的,但它可能給你一些線索。有一件事是弄清楚哪個C運行時庫中的每一個.libs(或'_a.libs',你可能想看看)被編譯,並確保它們在靜態鏈接時都是相同的。因此,由於您使用的是/ MD,請確保所有這些庫都使用/ MD編譯,而不是/ MT編譯。這可能是它沒有找到freetype符號的原因,但這只是一個猜測。祝你好運!