我想在Windows上构建一个简单的Qt项目,它包含一个main.cpp文件和一个dll . 使用CMake构建它没有任何问题:

project(app)
cmake_minimum_required(VERSION 2.6.0)
find_package(Qt4 REQUIRED QtCore QtGui QtXml)
...
add_executable(app main.cpp)
target_link_libraries(app ${QT_LIBRARIES} my_dll.dll)

然后我尝试使用qmake构建它:

...
SOURCES += main.cpp

win32:{
    LIBS += -L"my_dll.dll"
}

在这种情况下,构建失败,我得到链接器错误,如 undefined reference to 'my_function@8' ,其中 my_function 是my_dll.dll中的一个函数 .

当我用Dependency Walker打开my_dll.dll时,我可以看到所有函数名都没有修饰 . 我不知道为什么qmake尝试用'@ 8'来解析函数名 .

这是CMake写入链接日志的内容:

C:\MinGW\bin\g++.exe  -g    -Wl,--whole-archive CMakeFiles\app.dir/objects.a -Wl,--no-whole-archive  -o app.exe -Wl,--out-implib,libapp.dll.a -Wl,--major-image-version,0,--minor-image-version,0  C:\QT\2010.02.1\qt\lib\libQtGuid4.a C:\QT\2010.02.1\qt\lib\libQtXmld4.a C:\QT\2010.02.1\qt\lib\libQtCored4.a -l,my_dll -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

它还提供了一些警告:

Warning: resolving _my_fucntion@8 by linking to _my_function
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups

这就是qmake所说的:

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -o debug/aap1.exe debug/main.o  -L'c:/Qt/2010.02.1/qt/lib' -lmingw32 -lqtmaind -Lmy_dll.dll -lQtXmld4 -lQtGuid4 -lQtCored4

如何使用qmake构建我的项目?