配置 Qt .pro 文件以使用 cl.exe 和 link.exe 来修复链接错误

Posted

技术标签:

【中文标题】配置 Qt .pro 文件以使用 cl.exe 和 link.exe 来修复链接错误【英文标题】:Configuring Qt .pro file to use cl.exe and link.exe to fix linking errors 【发布时间】:2013-11-08 18:23:29 【问题描述】:

作为我 Qt 项目的一部分,我有一个 WSO2 WSF/C++ 模块作为 Web 服务。 现在,在 CLI(Windows 环境)中构建此模块的说明非常简单:

编译:

cl.exe /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "AXIS2_DECLARE_EXPORT" /D "AXIS2_SVR_MULTI_THREADED" /w /nologo /I %WSFCPP_HOME%\include /c hello.cpp

链接:

link.exe /nologo /LIBPATH:%WSFCPP_HOME%\lib axutil.lib axiom.lib axis2_parser.lib axis2_engine.lib wso2_wsf.lib /DLL /OUT:hello.dll *.obj


为了自动化构建过程,我想将这些步骤集成到我的 .pro 文件中。但是我完全不知道如何进行。有什么建议吗?


编辑:这是我当前的代码:

project.pro

TEMPLATE = lib
CONFIG += dll
CONFIG -= qt
VERSION = 1.0

TARGET = hello
SOURCES += hello.cpp
HEADERS += hello.hpp

DEFINES += AXIS2_DECLARE_EXPORT AXIS2_SVR_MULTI_THREADED

INCLUDEPATH += "C:\wsfcpp\include"

LIBS += \
    -L"C:\wsfcpp\lib" -laxutil \
    -laxiom \
    -laxis2_parser \
    -laxis2_engine \
    -lwso2_wsf

hello.hpp

#ifndef HELLO_H
#define HELLO_H

#include <ServiceSkeleton.h>
using namespace wso2wsf;

class Hello : public ServiceSkeleton

public:
    WSF_EXTERN WSF_CALL Hello();
    OMElement* WSF_CALL invoke(OMElement *message, MessageContext *msgCtx);
    OMElement* WSF_CALL onFault(OMElement *message);
    void WSF_CALL init();
    OMElement* greet(OMElement *inMsg);
; 
#endif // HELLO_H

hello.cpp

#include <ServiceSkeleton.h>
#include <iostream>
#include <stdio.h>
#include <axutil_env.h>
#include <Environment.h>
#include <OMText.h>
#include "hello.hpp"

using namespace wso2wsf;
using namespace std;

/** Load the service into axis2 engine */
WSF_SERVICE_INIT(Hello)

OMElement* Hello::invoke(OMElement *ele, MessageContext *msgCtx)

    return greet(ele);


OMElement* Hello::onFault(OMElement *ele)

    OMElement *responseEle = new OMElement("HelloServiceErrorResponse");
    responseEle->setText("Hello Service Failed");
    return responseEle;


void Hello::init()




OMElement* Hello::greet(OMElement* inMsg)

    OMElement *helloEle = new OMElement("greetResponse");
    OMElement *text = new OMElement("text");
    helloEle->setText(greet);
    return helloEle;

【问题讨论】:

Running a program/script from QMake 的可能重复项 【参考方案1】:

像这样创建一个 .pro 文件:

TEMPLATE = lib
TARGET = hello

DEFINES += AXIS2_DECLARE_EXPORT AXIS2_SVR_MULTI_THREADED
SOURCES += hello.cpp
LIBS += -Lpath/to/the/libs -laxutil -laxiom -laxis2_parser -laxis2_engine -lwso2_wsf

并将其集成到您的构建过程中。这将需要为 MSVC 编译您使用的 Qt/qmake。 (但在单个项目中混合 mingw 和 MSVC 无论如何都行不通)

【讨论】:

这正是我想要的,谢谢!所以我已将此代码 sn-p 添加到我的 .pro 文件中,但在链接阶段编译失败(几个 LNK2019 未解决的外部符号错误)。我有两个问题: 1. 如何在 .pro 文件中指定链接指令? 2、下面这行是什么意思:TEMPLATE = lib 我编辑了链接库的答案(不知道这是否正是需要的)。 TEMPLATE = lib 告诉 qmake 创建一个 DLL。 (与app相反,它创建一个.exe) 我们快到了...以前的错误已修复,但现在我收到 LNK1104: cannot open file 'axutil.lib' 您可能需要通过 -L 添加库的路径,例如-L$$WSFCPP_HOME/lib. 那么,您设置了 WSFCPP_HOME 环境变量吗?或者先尝试使用硬编码路径。

以上是关于配置 Qt .pro 文件以使用 cl.exe 和 link.exe 来修复链接错误的主要内容,如果未能解决你的问题,请参考以下文章

Qt工程pro文件的简单配置(尤其是第三方头文件和库)

Qt--Qt的简单介绍以及坐标系统

qt .pro文件和cmakelists.txt配置第三方库

qt中.pro文件调用多个makefile文件

Qt笔记-pro文件配置include和lib及遍历文件夹及文件排序

Qt笔记-pro文件配置include和lib及遍历文件夹及文件排序