库的链接顺序问题
Issue with Linking order of the libraries
我正在将数据从 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
我仍然收到链接器错误。有什么建议吗?
"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 error,ld
的出现就证明了这一点。目标文件和库的顺序很重要,因为它们需要在从另一个目标文件或库使用之前出现。
克服特定顺序需要让链接器看到符号的方法是使用 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
我正在将数据从 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
我仍然收到链接器错误。有什么建议吗?
"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 error,ld
的出现就证明了这一点。目标文件和库的顺序很重要,因为它们需要在从另一个目标文件或库使用之前出现。
克服特定顺序需要让链接器看到符号的方法是使用 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