我正在将数据从Visual Studio项目移植到Mingw GCC。
我相信我遇到了一个链接订单问题的库,我不确定如何规避这个问题。我目前有两个文件CWavImaData.cpp
和CWavData.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
我仍然收到链接器错误。有什么建议吗?
答案 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 error,ld
出现了证明这一点。目标文件和库的顺序很重要,因为它们需要在从另一个目标文件或库中使用之前出现。
要让链接器看到符号,需要克服特定顺序的方法是使用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