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

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

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

最佳答案

回答我自己的问题。

我的一位同事深入挖掘了他大脑中较为模糊的隐蔽处,并说他记得需要“dicklespeck”之类的东西。这听起来很奇怪所以我把它放在“如果一切都失败了我会查一下”的桶里。在所有其他方法都失败之后,我回到它并在谷歌上搜索了各种拼写,这表明他是正确的。如果我将这个可憎的内容添加到我的类(class)声明中:

__declspec(dllexport)

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

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

#ifndef CALCULATOR_H
#define CALCULATOR_H

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

#endif

呸!我可以为非 Windows 构建#define 去掉那个东西,但仍然 - 讨厌!

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

关于c++ - 使用 Maven NAR 插件在 Windows 上链接 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4939225/

相关文章:

c++ - 派生类如何使用虚拟基类的实例?

Java TrayIcon.displayMessage() 在 Windows XP 上不起作用

c - _popen 在同时具有 stdout 和 stdin 的 Windows 中

windows - 我使用的是 2MBPS 互联网连接,但我想检查一个网站,就像我在同一台电脑上使用 256 KBPS 连接一样?

windows - Windows 10 上的 api-ms-win-core-wow64-l1-1-1.dll

java - JNI - 是否可以用不同的类替换类的实例化?

php - Composer 安装 "PHP Warning: PHP Startup: Unable to load dynamic library ' gd 2'"

C++ 3d数组

c++ - 如何在 Eclipse CDT 中设置相应的 GCcflags和环境变量

c++ - 继承嵌套模板类的特化