库的链接顺序问题

Issue with Linking order of the libraries

我正在将数据从 Visual Studio 项目移植到 Mingw GCC。 我相信我 运行 遇到了库链接顺序问题,但我不确定如何规避此问题。我目前有两个文件 CWavImaData.cppCWavData.cpp。现在这两个文件都包含以下语句

{    
WAVEFORMATEXTENSIBLE *pex = reinterpret_cast<WAVEFORMATEXTENSIBLE*>(new char[sizeof(WAVEFORMATEXTENSIBLE)]);
    ....
    ....
    pex->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; <-- Conflicting Statement
}

现在 KSDATAFORMAT_SUBTYPE_PCM 依赖图书馆 libksguid.a。现在,如果我注释掉 CWavData.cpp 中的冲突语句,则项目构建正常。 但是,如果我取消注释这个冲突的语句,我会收到链接器错误。

CWavData.cpp:156: undefined reference to `_GUID const& __mingw_uuidof<KSDATAFORMAT_SUBTYPE_PCM_STRUCT>()'

这让我认为存在链接器错误。这是我的构建输出

g++.exe -shared -Wl,--output-def=libsndlib.def -Wl,--out-implib=libsndlib.a -Wl,--dll -LC:\mingw64\x86_64-w64-mingw32\lib -Lc:\MyProj\SharedFunctions\ -L"Win32\Debug x64" "Win32\Debug x64\ADPCM\CWavImaData.o" "Win32\Debug x64\CCategoryLst.o" "Win32\Debug x64\CSampleList.o" "Win32\Debug x64\CSeqScptList.o" "Win32\Debug x64\CSndDrv.o" "Win32\Debug x64\CSndLib.o" "Win32\Debug x64\CSndRam.o" "Win32\Debug x64\CSndScptList.o" "Win32\Debug x64\CSndSeq.o" "Win32\Debug x64\CSndStrHdl.o" "Win32\Debug x64\CWavData.o" "Win32\Debug x64\CWavDataList.o" "Win32\Debug x64\CWavDataStr.o" "Win32\Debug x64\dllmain.o" "Win32\Debug x64\misc\assert\myassert.o" "Win32\Debug x64\misc\CFindFile.o" "Win32\Debug x64\misc\CStrings.o" "Win32\Debug x64\misc\mydxerr.o" "Win32\Debug x64\SndInt.o"  -o sndlib.dll  -lksguid -lSharedFunctions -lole32 -lwinmm -ldsound -lksguid -lksguid
Win32\Debug x64\CWavData.o: In function `CWavData::AnalyzeFormatChunk(_iobuf*, long)':
C:/MyProj/sndlib/CWavData.cpp:156: undefined reference to `_GUID const& __mingw_uuidof<KSDATAFORMAT_SUBTYPE_PCM_STRUCT>()'
collect2.exe: error: ld returned 1 exit status

我什至尝试添加 ksguid 两次,但我仍然收到链接器错误。文件 CWavImaData.cpp 单独使用此语句构建良好,但是当此语句包含在文件 CWavData.cpp 中时,我收到链接器错误。关于如何解决此问题的任何建议?

更新: 我被建议使用 --start-group。尝试之后,这就是我的输出结果

g++.exe -shared -Wl,--output-def=libsndlib.def -Wl,--out-implib=libsndlib.a -Wl,--dll -LC:\mingw64\x86_64-w64-mingw32\lib -Lc:\MyProj\SharedFunctions\SharedFunctions\ -L"Win32\Debug x64" "Win32\Debug x64\ADPCM\CWavImaData.o" "Win32\Debug x64\CCategoryLst.o" "Win32\Debug x64\CSampleList.o" "Win32\Debug x64\CSeqScptList.o" "Win32\Debug x64\CSndDrv.o" "Win32\Debug x64\CSndLib.o" "Win32\Debug x64\CSndRam.o" "Win32\Debug x64\CSndScptList.o" "Win32\Debug x64\CSndSeq.o" "Win32\Debug x64\CSndStrHdl.o" "Win32\Debug x64\CWavData.o" "Win32\Debug x64\CWavDataList.o" "Win32\Debug x64\CWavDataStr.o" "Win32\Debug x64\dllmain.o" "Win32\Debug x64\misc\assert\myassert.o" "Win32\Debug x64\misc\CFindFile.o" "Win32\Debug x64\misc\CStrings.o" "Win32\Debug x64\misc\mydxerr.o" "Win32\Debug x64\SndInt.o"  -o sndlib.dll -Wl,--start-group -lksguid -Wl,--end-group  -lksguid -lSharedFunctions -lole32 -lwinmm -ldsound -lksguid -ldxerr8 -ldxerr9
Win32\Debug x64\CWavData.o: In function `CWavData::AnalyzeFormatChunk(_iobuf*, long)':
c:/MyProj/sndlib/CWavData.cpp:156: undefined reference to `_GUID const& __mingw_uuidof<KSDATAFORMAT_SUBTYPE_PCM_STRUCT>()'

然后我也尝试了这个

.. -o sndlib.dll -Wl,--start-group -lksguid -lSharedFunctions -lole32 -lwinmm -ldsound  -Wl,--end-group 

我也试过这个

.. -Wl,--start-group -lksguid -Wl,--end-group -lSharedFunctions -lole32 -lwinmm -ldsound 

我仍然收到链接器错误。有什么建议吗?

"This makes me think that there is a linker error. "

C:/MyProj/sndlib/CWavData.cpp:156: undefined reference to `_GUID const& __mingw_uuidof<KSDATAFORMAT_SUBTYPE_PCM_STRUCT>()'
collect2.exe: error: ld returned 1 exit status

当然是linker errorld的出现就证明了这一点。目标文件和库的顺序很重要,因为它们需要在从另一个目标文件或库使用之前出现。

克服特定顺序需要让链接器看到符号的方法是使用 GCC 的 -Wl,--start-group and -Wl,--end-group 选项,您可以使用它来创建出现在其中的库组,而不需要具体顺序。


至于您的评论和更新,您应该尝试以下链接器命令行:

g++.exe -shared -Wl,--output-def=libsndlib.def -Wl,--out-implib=libsndlib.a 
    -Wl,--dll -LC:\mingw64\x86_64-w64-mingw32\lib  
    -Lc:\MyProj\SharedFunctions\SharedFunctions\ -L"Win32\Debug x64"  
    "Win32\Debug x64\ADPCM\CWavImaData.o" "Win32\Debug x64\CCategoryLst.o"  
    "Win32\Debug x64\CSampleList.o" "Win32\Debug x64\CSeqScptList.o"  
    "Win32\Debug x64\CSndDrv.o" "Win32\Debug x64\CSndLib.o"  
    "Win32\Debug x64\CSndRam.o" "Win32\Debug x64\CSndScptList.o"  
    "Win32\Debug x64\CSndSeq.o"  
    "Win32\Debug x64\CSndStrHdl.o" "Win32\Debug x64\CWavData.o" 
    "Win32\Debug x64\CWavDataList.o" "Win32\Debug x64\CWavDataStr.o"  
    "Win32\Debug x64\dllmain.o" "Win32\Debug x64\misc\assert\myassert.o"  
    "Win32\Debug x64\misc\CFindFile.o" "Win32\Debug x64\misc\CStrings.o"  
    "Win32\Debug x64\misc\mydxerr.o" "Win32\Debug x64\SndInt.o"      
    -Wl,--start-group 
    -lksguid  -lSharedFunctions -lole32 -lwinmm -ldsound  
    -ldxerr8 -ldxerr9 
    -Wl,--end-group 
    -o sndlib.dll