这个问题是在Windows下使用g ++的动态链接库的上下文中。
请帮我理解一下。 我有一个库,SoundManager,我这样编译:
$(COMPILER) -o ./bin/SoundManager.dll ./src/SoundManager.cpp -shared -Wl,--out-implib,./lib/libSoundManager.a -shared -DSM_BUILD_DLL $(INCLUDE_PATHS) $(STANDARD) $(OPTIONS) $(LIB_PATHS) -lsfml-system -lsfml-audio
也就是说,它是一个包含处理声音播放的类的库,链接到SFML声音库。
现在,我有另一个库MyLibrary,我想在其中使用编译成SoundManager.dll的SoundManager类。我试过这个:
$(COMPILER) -o ./bin/MyLibrary.dll ./src/MyLibrary.cpp -shared -Wl,--out-implib,./lib/libMyLibrary.a -shared -DSW_BUILD_DLL $(INCLUDE_PATHS) $(STANDARD) $(OPTIONS) $(LIB_PATHS) -lSoundManager
最后,我链接到libSoundManager.a。 (LIB_PATHS包含libSoundManager.a所在的路径。)
然而,这不起作用。我收到以下错误消息:
undefined reference to `__imp__ZN2sf5SoundD1Ev'
undefined reference to `__imp__ZN2sf11SoundBufferD1Ev'
这告诉我,我需要链接一些缺少的导入库。如果我添加
-lsfml-system -lsfml-audio
所以我编译MyLibrary:
$(COMPILER) -o ./bin/MyLibrary.dll ./src/MyLibrary.cpp -shared -Wl,--out-implib,./lib/libMyLibrary.a -shared -DSW_BUILD_DLL $(INCLUDE_PATHS) $(STANDARD) $(OPTIONS) $(LIB_PATHS) -lSoundManager -lsfml-system -lsfml-audio
然后编译!
问题:为什么我需要链接
-lsfml-system -lsfml-audio
编译MyLibrary时?我在编译SoundManager时已经链接过它们,当我编译MyLibrary时我链接到libSoundManager.a。难道不能在libSoundManager.a中处理DLL查找表吗?
感谢。