Как связать статическую библиотеку, которая сама использует статические библиотеки, используя scons и Visual C ++? - PullRequest
0 голосов
/ 24 марта 2011

Мой файл SConstruct выглядит примерно так:

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)" (??1Font@jn
gl@@QEAA@XZ)
... and so on

Почему нетэто найти символ FT_Done_FreeType, который находится в freetype.lib?Отлично работает с GCC.

1 Ответ

1 голос
/ 04 апреля 2011

В Windows есть много причуд со статическим связыванием. У меня была одна или две схожие проблемы, но в основном моя проблема заключалась в том, что после компиляции «статических» библиотек они все еще зависели от наличия .dll.Во всяком случае, я уже некоторое время чувствую вашу боль, но прошла через это для моих целей ... вот одна страница, которая действительно помогла мне.

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

Это несвязаны с теми конкретными библиотеками, которые вы перечислили, но это может дать вам некоторые подсказки.Одна вещь заключается в том, чтобы выяснить, с какой библиотекой C-runtime каждая из этих .libs (или «_a.libs», которую вы, возможно, захотите посмотреть), были скомпилированы, и убедиться, что они все одинаковые, когда вы статически связываете.Так как вы используете / MD, убедитесь, что все эти библиотеки также скомпилированы с / MD, а не / MT.Это МОЖЕТ быть причиной, по которой он не находит этот символ свободного типа, но это всего лишь одно предположение.Удачи!

...