1

我正在尝试使用 Maven NAR 插件构建一个非常简单的 C++ 程序。我已经设置了一个 Maven 模块来构建共享库,另一个用于在库中链接并构建使用它的可执行文件。在 Mac 上构建效果很好,我可以运行该程序。不幸的是,使用 MS Visual C++(免费版)在 Windows (XP) 上构建失败并出现链接器错误。两台机器(除了操作系统和编译器)配置的唯一区别是我在 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 配置来实现它。谢谢。

我的共享库模块:

计算器.h

#ifndef CALCULATOR_H
#define CALCULATOR_H

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

#endif

计算器.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>

我的可执行模块:

主文件

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

1 回答 1

2

回答我自己的问题。

我的一位同事深入研究了他大脑中比较模糊的地方,并说他回忆起需要“dicklespeck”之类的东西。这听起来很奇怪,所以我把它放在“如果一切都失败了,我会查一下”的桶中。在所有其他方法都失败后,我回到它并用谷歌搜索了各种拼写,结果表明他是正确的。如果我将这个可憎的东西添加到我的班级声明中:

__declspec(dllexport)

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

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

#ifndef CALCULATOR_H
#define CALCULATOR_H

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

#endif

呸!#define对于非 Windows 版本,我可以把它拿走,但仍然 - 太糟糕了!

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

于 2011-02-08T23:53:11.790 回答