链接库的顺序问题

时间:2015-03-11 18:42:20

标签: c++ gcc linker

我正在将数据从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 

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

1 个答案:

答案 0 :(得分:0)

  

&#34;这让我觉得有一个链接器错误。 &#34;

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-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