看似正确引用后对 dll 库中函数的未定义引用
Undefined reference to function in dll library after seemingly correct referencing
我正在尝试使用我的主板(来自制造商 Advantech)随附的 API。 API 由一个 .dll 文件、一个 .lib 文件和几个头文件组成。可以在这个link下载: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 中配置编译和 linking 设置(通过右键单击项目并转到 "Properties"->"C/C++ Build"->"Settings"),但是我可以从 Eclipse 控制台看到生成的 GCC 命令是什么样的。我假设在此处复制和粘贴这些命令比附上我的 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 继续尝试使用库 link 这个目标文件,使用以下命令:
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.
但是上面的linking命令失败了,returns:
./src/SUSI_C_test.c:9: undefined reference to `SusiLibInitialize'
collect2.exe: error: ld returned 1 exit status
我已检查我尝试调用的函数确实存在于.dll 文件中,使用程序"DLL Export Viewer" 查看Susi4.dll 中定义的不同函数。请参阅下面的屏幕截图:
那我做错了什么?非常感谢您提供的任何建议。
gcc 可以 link 对抗 SUSI4.dll。使用 FIND_LIBRARY(DLL_SUSI4 Susi4.dll ${CMAKE_SOURCE_DIR}/lib/susi4) 和 TARGET_LINK_LIBRARIES(proggi ${DLL_SUSI4}) 命令你的 cmake 脚本。将创建一个可执行文件。当您执行程序时,请确保 dll 位于同一路径中。
我正在尝试使用我的主板(来自制造商 Advantech)随附的 API。 API 由一个 .dll 文件、一个 .lib 文件和几个头文件组成。可以在这个link下载: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 中配置编译和 linking 设置(通过右键单击项目并转到 "Properties"->"C/C++ Build"->"Settings"),但是我可以从 Eclipse 控制台看到生成的 GCC 命令是什么样的。我假设在此处复制和粘贴这些命令比附上我的 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 继续尝试使用库 link 这个目标文件,使用以下命令:
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.
但是上面的linking命令失败了,returns:
./src/SUSI_C_test.c:9: undefined reference to `SusiLibInitialize'
collect2.exe: error: ld returned 1 exit status
我已检查我尝试调用的函数确实存在于.dll 文件中,使用程序"DLL Export Viewer" 查看Susi4.dll 中定义的不同函数。请参阅下面的屏幕截图:
那我做错了什么?非常感谢您提供的任何建议。
gcc 可以 link 对抗 SUSI4.dll。使用 FIND_LIBRARY(DLL_SUSI4 Susi4.dll ${CMAKE_SOURCE_DIR}/lib/susi4) 和 TARGET_LINK_LIBRARIES(proggi ${DLL_SUSI4}) 命令你的 cmake 脚本。将创建一个可执行文件。当您执行程序时,请确保 dll 位于同一路径中。