首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Maven NAR插件在Windows上链接DLL

使用Maven NAR插件在Windows上链接DLL
EN

Stack Overflow用户
提问于 2011-02-08 22:24:39
回答 1查看 2.1K关注 0票数 1

我正在尝试使用Maven NAR插件构建一个非常简单的C++程序。我已经设置了一个Maven模块来构建一个共享库,另一个模块用于在库中链接并构建一个使用它的可执行文件。在Mac上构建很好,我可以运行这个程序。不幸的是,在Windows (XP)上使用MS Visual C++ (免费版本)构建时,链接器错误导致失败。这两台机器(操作系统和编译器除外)的唯一不同之处在于,在Windows机器上使用Maven构建之前,我运行vcvars32.bat。下面是我遇到的错误:

代码语言:javascript
复制
main.obj : error LNK2019: unresolved external symbol "public: int __thiscall 
Calculator::add(int,int)" (?add@Calculator@@QAEHHH@Z) referenced in function
_main executable.exe : fatal error LNK1120: 1 unresolved externals

NAR插件发出的链接器命令如下所示:

代码语言:javascript
复制
link /MANIFEST /NOLOGO /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /OUT:executable.exe
C:\dev\Projects\trunk\executable\target\nar\obj\x86-Windows-msvc\main.obj

我希望它应该列出由我的共享库模块生成的DLL,但它不存在。DLL的NAR被解压缩在可执行文件的目标目录中,这是应该的。

任何有关为Windows配置NAR插件的帮助都将不胜感激。或者,一个显示如何正确执行链接器的命令行将是有用的,因此我可以回填NAR配置来实现它。谢谢。

我的共享库模块:

Calculator.h

代码语言:javascript
复制
#ifndef CALCULATOR_H
#define CALCULATOR_H

class Calculator {
public:
    int add(int first, int second);
};

#endif

Calculator.cc

代码语言:javascript
复制
#include "Calculator.h"

int Calculator::add(int first, int second) {
    return first + second;
}

pom.xml (片段):

代码语言:javascript
复制
<groupId>com.mycompany</groupId>
<artifactId>library</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>nar</packaging>

...

<plugin>
    <artifactId>maven-nar-plugin</artifactId>
    <version>2.1-SNAPSHOT</version>
    <extensions>true</extensions>
    <configuration>
        <libraries>
            <library>
                <type>shared</type>
            </library>
        </libraries>
    </configuration>
</plugin>

我的可执行模块:

main.cc

代码语言:javascript
复制
#include <iostream>
#include "Calculator.h"

int main() {
    Calculator calculator;
    std::cout << calculator.add(2, 5) << std::endl;
}

pom.xml (片段)

代码语言:javascript
复制
<groupId>com.mycompany</groupId>
<artifactId>executable</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>nar</packaging>

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>library</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <type>nar</type>
</dependency>

...

<plugin>
    <artifactId>maven-nar-plugin</artifactId>
    <version>2.1-SNAPSHOT</version>
    <extensions>true</extensions>
    <configuration>
        <libraries>
            <library>
                <type>executable</type>
            </library>
        </libraries>
    </configuration>
</plugin>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-08 23:53:11

回答我自己的问题。

我的一位同事深入到他大脑中更黑暗的角落,说他回忆起需要的东西,比如“小弟弟”。这听起来怪怪的,所以我把它放在“如果其他一切都失败了,我会去找”桶。毕竟,所有的失败,我回到它和谷歌的各种拼写显示,他是正确的。如果我把这个令人厌恶的东西加到我的班级宣言中:

代码语言:javascript
复制
__declspec(dllexport)

DLL成功地与可执行文件链接。

因此,像这样“修复”Calculator头文件是解决方案:

代码语言:javascript
复制
#ifndef CALCULATOR_H
#define CALCULATOR_H

class __declspec(dllexport) Calculator {
public:
    int add(int first, int second);
};

#endif

真讨厌!我可以#define的东西,为非窗口的建设,但仍然-讨厌!

有人告诉我这不是唯一的解决办法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4939225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档