在看似正确的引用之后,对dll库中的函数进行了未定义的引用

时间:2016-10-25 13:12:21

标签: c eclipse gcc dll mingw

我正在尝试使用我的主板附带的API(来自制造商Advantech)。 API由.dll文件,.lib文件和几个头文件组成。可以通过以下链接下载:http://support.advantech.com/support/DownloadSRDetail_New.aspx?SR_ID=1-RMSXG5&Doc_Source=Download

我在Windows 10中使用Eclipse,它本身使用MinGW和GCC。

我编写了一个非常简单的测试程序,其中包含API附带的头文件,并从API调用单个函数:

// Headers that came with the API
#include "OsDeclarations.h"
#include "Susi4.h"

int main(void) {

    // Function that is part of the API, and is
    // declared in Susi4.h, and defined in Susi4.dll.
    SusiLibInitialize();

    return 0;
}

我已经阅读了使用上面的工具链来引用库目录和库本身(称为Susi4.dll)的说明。我正在Eclipse GUI中配置编译和链接设置(通过右键单击项目并转到“属性” - >“C / C ++ Build” - >“设置”),但我可以看到结果GCC命令看起来像是从Eclipse控制台。我假设在这里复制和粘贴这些命令比附加我的GUI的截图更有帮助,但请记住我不是在编写这些gcc命令;它们是由Eclipse生成的,在GUI的配置设置背面:

首先,编译命令:

gcc -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\SUSI_C_test.o" "..\\src\\SUSI_C_test.c" 

我已将头文件(包含在API中并在代码中引用)放在与SUSI_C_test.c相同的源目录中,因此这看起来很好,并生成目标文件SUSI_C_test.o。

接下来,Eclipse继续尝试使用以下命令将此目标文件与库链接:

gcc "-LC:\\Program Files\\Advantech\\SUSI\\SDK\\SUSI4\\lib\\x86" -o SUSI_C_test.exe "src\\SUSI_C_test.o" -lSusi4

我指定的“x86”目录包含我下载的API附带的两个文件:Susi4.dll和Susi4.lib。

但是上面的链接命令失败了,并返回:

./src/SUSI_C_test.c:9: undefined reference to `SusiLibInitialize'
collect2.exe: error: ld returned 1 exit status

我已经检查过我试图调用的函数确实存在于.dll文件中,使用程序“DLL Export Viewer”查看Susi4.dll中定义的不同函数。见下面的截图:

Screenshot of DLL Export Viewer showing SusiLibInitialize present in library

那么我做错了什么?非常感谢您提出的任何建议。

1 个答案:

答案 0 :(得分:0)

gcc可以链接SUSI4.dll。在cmake脚本中使用FIND_LIBRARY(DLL_SUSI4 Susi4.dll $ {CMAKE_SOURCE_DIR} / lib / susi4)和TARGET_LINK_LIBRARIES(proggi $ {DLL_SUSI4})命令。将创建一个可执行文件。执行程序时,请确保dll在同一路径中。