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

时间:2011-02-08 22:24:39

标签: c++ windows dll maven maven-nar-plugin

我正在尝试使用Maven NAR插件构建一个非常简单的C ++程序。我已经设置了一个用于构建共享库的Maven模块,另一个用于在库中进行链接并构建使用它的可执行文件。在Mac上构建很好,我可以运行该程序。不幸的是,使用MS Visual C ++(免费版)在Windows(XP)上构建失败并出现链接器错误。两台机器(OS和编译器除外)之间配置的唯一区别是我在Windows机器上使用Maven构建之前运行vcvars32.bat。这是我得到的错误:

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插件吐出的链接器命令如下所示:

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

#ifndef CALCULATOR_H
#define CALCULATOR_H

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

#endif

Calculator.cc

#include "Calculator.h"

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

pom.xml(代码段):

<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

#include <iostream>
#include "Calculator.h"

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

pom.xml(代码段)

<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>

1 个答案:

答案 0 :(得分:2)

回答我自己的问题。

我的一位同事挖掘了他大脑的阴影,并说他回忆起需要“dicklespeck”之类的东西。这听起来很奇怪,所以我把它放在“如果一切都失败我会看起来那么多”桶。在所有其他方法都失败后,我回过头来搜索各种拼写,证明他是正确的。如果我将这种憎恶加入到我的班级宣言中:

__declspec(dllexport)

DLL成功链接可执行文件。

所以“修复”计算器头文件是这样的解决方案:

#ifndef CALCULATOR_H
#define CALCULATOR_H

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

#endif

呸!对于非Windows版本,我可以#define那件事,但仍然 - 哎呀!

有人请告诉我这不是唯一的解决方案。