0

我有一个 c 项目,我想用 MinGW 在 CodeBlocks 中编译它。我试图链接它所需的库,但我得到了

未定义的参考错误

于是我搜了一下,发现我使用的库是用MVC++编译的,不能和MinGW一起使用。(我不是 c 方面的专家,所以我有点困惑。)我找到了这个链接并按照他们所说的来解决我的问题。

我从原始的axis2c .dll 文件创建了axis2c .a 文件。

  • 我用 reimp 创建了 .def 文件
  • 然后我修改了 .def 文件中的每个 stdcall 函数(我将“_name@ordinal”更改为“name”)
  • 然后我使用 dlltool 创建 .a 文件。

我将 .a 文件链接到我的项目。一切顺利,我可以编译我的项目。但是当我尝试运行它时。我得到这个错误。

在动态链接库中找不到过程入口点 axiom_attribute_create

我已将我的项目包含在此链接中。

我用 MinGW 下载了一个 CodeBlocks。codeblocks-10.05mingw-setup.exe (我猜它使用MinGw32bit)。然后我按照@mikekinghan 所说的步骤设置Build Options。然后我建立了这个项目。我得到了这个错误。我已经将 Axis2c lib 文件夹添加到路径环境中。(我什至按照@mikekinghan 的建议将 axiom.dll 复制到“C:\Windows\SysWOW64”。

这是构建日志:

-------------- Build: Debug in Math ---------------

mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\adb_addOperatorResponse.c -o obj\Debug\adb_addOperatorResponse.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from E:\dev\c\Math\adb_addOperatorResponse.h:21,
                 from E:\dev\c\Math\adb_addOperatorResponse.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\adb_addOperatorResponse.c: In function 'adb_addOperatorResponse_serialize_obj':
E:\dev\c\Math\adb_addOperatorResponse.c:466: warning: format '%I32d' expects type 'long int', but argument 3 has type 'int'
E:\dev\c\Math\adb_addOperatorResponse.c:374: warning: unused variable 'ns_already_defined'
E:\dev\c\Math\adb_addOperatorResponse.c:372: warning: unused variable 'qname_prefix'
E:\dev\c\Math\adb_addOperatorResponse.c:371: warning: unused variable 'qname_uri'
E:\dev\c\Math\adb_addOperatorResponse.c:367: warning: unused variable 'tag_closed'
E:\dev\c\Math\adb_addOperatorResponse.c: In function 'adb_addOperatorResponse_reset_addOperatorReturn':
E:\dev\c\Math\adb_addOperatorResponse.c:568: warning: unused variable 'element'
E:\dev\c\Math\adb_addOperatorResponse.c:567: warning: unused variable 'count'
E:\dev\c\Math\adb_addOperatorResponse.c:566: warning: unused variable 'i'
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\axis2_extension_mapper.c -o obj\Debug\axis2_extension_mapper.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from E:\dev\c\Math\axis2_extension_mapper.h:14,
                 from E:\dev\c\Math\axis2_extension_mapper.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\axis2_extension_mapper.c: In function 'axis2_extension_mapper_type_from_node':
E:\dev\c\Math\axis2_extension_mapper.c:31: warning: unused variable 'element_qname'
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\axis2_stub_MathService.c -o obj\Debug\axis2_stub_MathService.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from C:\Tools\axis2c\include/neethi_includes.h:22,
                 from C:\Tools\axis2c\include/neethi_operator.h:29,
                 from C:\Tools\axis2c\include/neethi_policy.h:29,
                 from C:\Tools\axis2c\include/axis2_svc_client.h:56,
                 from C:\Tools\axis2c\include/axis2_stub.h:35,
                 from C:\Tools\axis2c\include/axis2_client.h:31,
                 from E:\dev\c\Math\axis2_stub_MathService.h:14,
                 from E:\dev\c\Math\axis2_stub_MathService.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\axis2_stub_MathService.c: In function 'axis2_stub_populate_services_for_MathService':
E:\dev\c\Math\axis2_stub_MathService.c:72: warning: unused variable 'status'
E:\dev\c\Math\axis2_stub_MathService.c:71: warning: unused variable 'neethi_policy'
E:\dev\c\Math\axis2_stub_MathService.c:70: warning: unused variable 'policy_root_ele'
E:\dev\c\Math\axis2_stub_MathService.c:69: warning: unused variable 'policy_node'
E:\dev\c\Math\axis2_stub_MathService.c:68: warning: unused variable 'desc'
E:\dev\c\Math\axis2_stub_MathService.c:66: warning: unused variable 'policy_include'
E:\dev\c\Math\axis2_stub_MathService.c: In function 'axis2_stub_on_complete_MathService_addOperator':
E:\dev\c\Math\axis2_stub_MathService.c:277: warning: unused variable 'soap_fault'
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\main.c -o obj\Debug\main.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from C:\Tools\axis2c\include/neethi_includes.h:22,
                 from C:\Tools\axis2c\include/neethi_operator.h:29,
                 from C:\Tools\axis2c\include/neethi_policy.h:29,
                 from C:\Tools\axis2c\include/axis2_svc_client.h:56,
                 from C:\Tools\axis2c\include/axis2_stub.h:35,
                 from C:\Tools\axis2c\include/axis2_client.h:31,
                 from E:\dev\c\Math\axis2_stub_MathService.h:14,
                 from E:\dev\c\Math\main.c:1:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\main.c:3: warning: second argument of 'main' should be 'char **'
E:\dev\c\Math\main.c: In function 'main':
E:\dev\c\Math\main.c:8: warning: unused variable 'operation'
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\adb_addOperator.c -o obj\Debug\adb_addOperator.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from E:\dev\c\Math\adb_addOperator.h:21,
                 from E:\dev\c\Math\adb_addOperator.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\adb_addOperator.c: In function 'adb_addOperator_serialize_obj':
E:\dev\c\Math\adb_addOperator.c:574: warning: format '%I32d' expects type 'long int', but argument 3 has type 'int'
E:\dev\c\Math\adb_addOperator.c:640: warning: format '%I32d' expects type 'long int', but argument 3 has type 'int'
E:\dev\c\Math\adb_addOperator.c:480: warning: unused variable 'ns_already_defined'
E:\dev\c\Math\adb_addOperator.c:478: warning: unused variable 'qname_prefix'
E:\dev\c\Math\adb_addOperator.c:477: warning: unused variable 'qname_uri'
E:\dev\c\Math\adb_addOperator.c:473: warning: unused variable 'tag_closed'
E:\dev\c\Math\adb_addOperator.c: In function 'adb_addOperator_reset_num1':
E:\dev\c\Math\adb_addOperator.c:742: warning: unused variable 'element'
E:\dev\c\Math\adb_addOperator.c:741: warning: unused variable 'count'
E:\dev\c\Math\adb_addOperator.c:740: warning: unused variable 'i'
E:\dev\c\Math\adb_addOperator.c: In function 'adb_addOperator_reset_num2':
E:\dev\c\Math\adb_addOperator.c:848: warning: unused variable 'element'
E:\dev\c\Math\adb_addOperator.c:847: warning: unused variable 'count'
E:\dev\c\Math\adb_addOperator.c:846: warning: unused variable 'i'
mingw32-g++.exe -LC:\Tools\axis2c\include -LE:\dev\CodeBlocks\MinGW\lib  -o bin\Debug\Math.exe obj\Debug\adb_addOperatorResponse.o obj\Debug\axis2_extension_mapper.o obj\Debug\axis2_stub_MathService.o obj\Debug\main.o obj\Debug\adb_addOperator.o   -laxiom -laxutil -laxis2_engine -laxis2_parser  
e:/dev/codeblocks/mingw/bin/../lib/gcc/mingw32/4.4.1/../../../../mingw32/bin/ld.exe: cannot find -laxiom
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 6 seconds)
1 errors, 35 warnings

似乎我把 ../include 放在搜索目录>链接器中是错误的,我修复了这个错误。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我建立了项目,然后我得到了这个:

-------------- Build: Debug in Math ---------------

mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\adb_addOperatorResponse.c -o obj\Debug\adb_addOperatorResponse.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from E:\dev\c\Math\adb_addOperatorResponse.h:21,
                 from E:\dev\c\Math\adb_addOperatorResponse.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\adb_addOperatorResponse.c: In function 'adb_addOperatorResponse_serialize_obj':
E:\dev\c\Math\adb_addOperatorResponse.c:466: warning: format '%I32d' expects type 'long int', but argument 3 has type 'int'
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\axis2_extension_mapper.c -o obj\Debug\axis2_extension_mapper.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from E:\dev\c\Math\axis2_extension_mapper.h:14,
                 from E:\dev\c\Math\axis2_extension_mapper.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\axis2_stub_MathService.c -o obj\Debug\axis2_stub_MathService.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from C:\Tools\axis2c\include/neethi_includes.h:22,
                 from C:\Tools\axis2c\include/neethi_operator.h:29,
                 from C:\Tools\axis2c\include/neethi_policy.h:29,
                 from C:\Tools\axis2c\include/axis2_svc_client.h:56,
                 from C:\Tools\axis2c\include/axis2_stub.h:35,
                 from C:\Tools\axis2c\include/axis2_client.h:31,
                 from E:\dev\c\Math\axis2_stub_MathService.h:14,
                 from E:\dev\c\Math\axis2_stub_MathService.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\main.c -o obj\Debug\main.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from C:\Tools\axis2c\include/neethi_includes.h:22,
                 from C:\Tools\axis2c\include/neethi_operator.h:29,
                 from C:\Tools\axis2c\include/neethi_policy.h:29,
                 from C:\Tools\axis2c\include/axis2_svc_client.h:56,
                 from C:\Tools\axis2c\include/axis2_stub.h:35,
                 from C:\Tools\axis2c\include/axis2_client.h:31,
                 from E:\dev\c\Math\axis2_stub_MathService.h:14,
                 from E:\dev\c\Math\main.c:1:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\main.c:3: warning: second argument of 'main' should be 'char **'
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\adb_addOperator.c -o obj\Debug\adb_addOperator.o
In file included from C:\Tools\axis2c\include/platforms/axutil_platform_auto_sense.h:40,
                 from C:\Tools\axis2c\include/axutil_dll_desc.h:31,
                 from C:\Tools\axis2c\include/axutil_class_loader.h:31,
                 from C:\Tools\axis2c\include/axis2_util.h:24,
                 from E:\dev\c\Math\adb_addOperator.h:21,
                 from E:\dev\c\Math\adb_addOperator.c:10:
C:\Tools\axis2c\include/platforms/windows/axutil_windows.h:221:5: warning: "/*" within comment
E:\dev\c\Math\adb_addOperator.c: In function 'adb_addOperator_serialize_obj':
E:\dev\c\Math\adb_addOperator.c:574: warning: format '%I32d' expects type 'long int', but argument 3 has type 'int'
E:\dev\c\Math\adb_addOperator.c:640: warning: format '%I32d' expects type 'long int', but argument 3 has type 'int'
mingw32-g++.exe -LC:\Tools\axis2c\lib -LE:\dev\CodeBlocks\MinGW\lib  -o bin\Debug\Math.exe obj\Debug\adb_addOperatorResponse.o obj\Debug\axis2_extension_mapper.o obj\Debug\axis2_stub_MathService.o obj\Debug\main.o obj\Debug\adb_addOperator.o   -laxiom -laxutil -laxis2_engine -laxis2_parser  
obj\Debug\adb_addOperatorResponse.o: In function `adb_addOperatorResponse_create':
E:/dev/c/Math/adb_addOperatorResponse.c:58: undefined reference to `_imp__axutil_error_set_error_number'
E:/dev/c/Math/adb_addOperatorResponse.c:58: undefined reference to `_imp__axutil_error_set_status_code'
E:/dev/c/Math/adb_addOperatorResponse.c:64: undefined reference to `_imp__axutil_strdup'
E:/dev/c/Math/adb_addOperatorResponse.c:67: undefined reference to `_imp__axutil_qname_create'
obj\Debug\adb_addOperatorResponse.o: In function `adb_addOperatorResponse_free_obj':
E:/dev/c/Math/adb_addOperatorResponse.c:139: undefined reference to `_imp__axutil_error_set_error_number'
E:/dev/c/Math/adb_addOperatorResponse.c:139: undefined reference to `_imp__axutil_error_set_status_code'
E:/dev/c/Math/adb_addOperatorResponse.c:139: undefined reference to `_imp__axutil_error_set_status_code'
E:/dev/c/Math/adb_addOperatorResponse.c:150: undefined reference to `_imp__axutil_qname_free'
obj\Debug\adb_addOperatorResponse.o: In function `adb_addOperatorResponse_deserialize_obj':
E:/dev/c/Math/adb_addOperatorResponse.c:209: undefined reference to `_imp__axutil_error_set_error_number'
E:/dev/c/Math/adb_addOperatorResponse.c:209: undefined reference to `_imp__axutil_error_set_status_code'
E:/dev/c/Math/adb_addOperatorResponse.c:209: undefined reference to `_imp__axutil_error_set_status_code'
E:/dev/c/Math/adb_addOperatorResponse.c:215: undefined reference to `_imp__axiom_node_get_next_sibling'
E:/dev/c/Math/adb_addOperatorResponse.c:213: undefined reference to `_imp__axiom_node_get_node_type'
E:/dev/c/Math/adb_addOperatorResponse.c:227: undefined reference to `_imp__axiom_node_get_data_element'
E:/dev/c/Math/adb_addOperatorResponse.c:228: undefined reference to `_imp__axiom_element_get_qname'
E:/dev/c/Math/adb_addOperatorResponse.c:229: undefined reference to `_imp__axutil_qname_equals'
E:/dev/c/Math/adb_addOperatorResponse.c:232: undefined reference to `_imp__axiom_node_get_first_child'
E:/dev/c/Math/adb_addOperatorResponse.c:237: undefined reference to `_imp__axutil_qname_to_string'
E:/dev/c/Math/adb_addOperatorResponse.c:237: undefined reference to `_imp__axutil_qname_to_string'
E:/dev/c/Math/adb_addOperatorResponse.c:260: undefined reference to `_imp__axiom_node_get_next_sibling'
E:/dev/c/Math/adb_addOperatorResponse.c:258: undefined reference to `_imp__axiom_node_get_node_type'
E:/dev/c/Math/adb_addOperatorResponse.c:264: undefined reference to `_imp__axiom_node_get_data_element'
E:/dev/c/Math/adb_addOperatorResponse.c:265: undefined reference to `_imp__axiom_element_get_qname'
E:/dev/c/Math/adb_addOperatorResponse.c:268: undefined reference to `_imp__axutil_qname_create'
E:/dev/c/Math/adb_addOperatorResponse.c:272: undefined reference to `_imp__axutil_qname_equals'
E:/dev/c/Math/adb_addOperatorResponse.c:274: undefined reference to `_imp__axutil_qname_equals'
E:/dev/c/Math/adb_addOperatorResponse.c:280: undefined reference to `_imp__axiom_element_get_text'
E:/dev/c/Math/adb_addOperatorResponse.c:298: undefined reference to `_imp__axutil_qname_free'
E:/dev/c/Math/adb_addOperatorResponse.c:308: undefined reference to `_imp__axutil_qname_free'
E:/dev/c/Math/adb_addOperatorResponse.c:317: undefined reference to `_imp__axutil_qname_free'
obj\Debug\adb_addOperatorResponse.o: In function `adb_addOperatorResponse_serialize_obj':
E:/dev/c/Math/adb_addOperatorResponse.c:392: undefined reference to `_imp__axutil_error_set_error_number'
E:/dev/c/Math/adb_addOperatorResponse.c:392: undefined reference to `_imp__axutil_error_set_status_code'
E:/dev/c/Math/adb_addOperatorResponse.c:392: undefined reference to `_imp__axutil_error_set_status_code'
E:/dev/c/Math/adb_addOperatorResponse.c:395: undefined reference to `_imp__axutil_hash_make'
E:/dev/c/Math/adb_addOperatorResponse.c:398: undefined reference to `_imp__axiom_namespace_create'
E:/dev/c/Math/adb_addOperatorResponse.c:401: undefined reference to `_imp__axutil_strdup'
E:/dev/c/Math/adb_addOperatorResponse.c:401: undefined reference to `_imp__axutil_hash_set'
E:/dev/c/Math/adb_addOperatorResponse.c:404: undefined reference to `_imp__axiom_element_create'
E:/dev/c/Math/adb_addOperatorResponse.c:407: undefined reference to `_imp__axiom_element_set_namespace'
E:/dev/c/Math/adb_addOperatorResponse.c:411: undefined reference to `_imp__axiom_data_source_create'
E:/dev/c/Math/adb_addOperatorResponse.c:412: undefined reference to `_imp__axiom_data_source_get_stream'
E:/dev/c/Math/adb_addOperatorResponse.c:414: undefined reference to `_imp__axutil_hash_get'
E:/dev/c/Math/adb_addOperatorResponse.c:418: undefined reference to `_imp__axutil_hash_set'
E:/dev/c/Math/adb_addOperatorResponse.c:420: undefined reference to `_imp__axiom_namespace_create'
E:/dev/c/Math/adb_addOperatorResponse.c:420: undefined reference to `_imp__axiom_element_declare_namespace_assume_param_ownership'
E:/dev/c/Math/adb_addOperatorResponse.c:436: undefined reference to `_imp__axutil_strlen'
E:/dev/c/Math/adb_addOperatorResponse.c:436: undefined reference to `_imp__axutil_strlen'
E:/dev/c/Math/adb_addOperatorResponse.c:441: undefined reference to `_imp__axutil_strlen'
E:/dev/c/Math/adb_addOperatorResponse.c:441: undefined reference to `_imp__axutil_strlen'
E:/dev/c/Math/adb_addOperatorResponse.c:458: undefined reference to `_imp__axutil_strcmp'
Process terminated with status 1 (0 minutes, 9 seconds)
50 errors, 9 warnings

形成@MikeKinghan 试图教我的内容,我现在理解了链接器命令的含义,并且我看到这次链接器设置正确。但为什么它不能正确编译?

4

2 回答 2

0

我不遵循您所采取的步骤背后的推理,也没有关于您所做工作的任何具体数据,所以这是“来自第一原则”的答案。

如果您想使用Microsoft 的链接器(您没有这样做)将 DLLfoo.dll与您的程序链接,您不能直接传递给链接器。如您所知,您必须改为传递一个导入库 ,它是一个小型静态“存根”库,表示由 导出的函数。在运行时,程序加载器扫描这些存根并(如果可能)将它们替换为对导出函数的匹配引用,通过根据Windows DLL 搜索路径搜索可用的 DLL 来找到这些函数。foo.dllfoo.libfoo.dll

如果您想foo.dll使用 MinGW GNU 链接器(您正在这样做)与您的程序链接,则不需要导入库foo.lib。这个链接器可以foo.dll直接链接。你没有理由不这样做。

foo.dll使用 MinGW GNU 链接器直接与您的程序链接,链接器当然必须能够foo.dll在链接时按照其查找库(无论是静态的还是动态的)所遵循的规则进行查找。就像微软的链接器一样,DLL 的成功链接并不能保证程序加载器在运行时也能找到该 DLL。程序加载器根据 Windows DLL 搜索路径搜索 DLL:它不知道也不关心您用于链接程序的链接器。您必须确保链接器在链接时找到 DLL,然后您需要确保程序加载器会在运行时找到它。

你如何告诉 MinGW 链接器foo.dll直接链接?您只需遵循将库传递给链接器的规则,如此所述。

但在您尝试之前,还必须满足另一个基本条件。您不能将 32 位 DLL 与 64 位程序链接,反之亦然。您说您正在使用 64 位 MinGW 进行构建;所以默认情况下它将构建 64 位可执行文件,如果您正在构建 64 位,那么您必须将其与DLL.exe的 64 位构建链接。axis2c

我不知道你从哪里得到你的axis2c库,但如果你下载了 Apache 的 v1.6.0 二进制存档,那么你就有了 32 位 DLL。

您可以告诉您的 64 位 MinGW 构建一个 32 位.exe,但您可能更愿意将它与 64 位axis2cDLL 链接。幸运的是,Google 提供了 64 位版本。从这里下载。64 位存档是 x86_64-wsdk7.1-r7acae470da50.7z。在方便的地方下载;用 提取它7-Zip,然后我建议您将提取的文件夹重命名为可以清楚识别它的名称,例如axis2c-x86_64-google.

现在,我将在命令提示符处编译并链接一个示例axis2c程序,遵循链接器查找库的规则。我将构建的程序是 Apache 包中提供的示例程序之一:axis2c-bin-1.6.0-win32\samples\src\client\echo. 我是随机挑选的:它只包含一个源文件,即echo.c. 我的工具链是 64 位 GCC 4.9.2。我axis2c下载了 64 位软件包,解压缩并重命名为 C:\develop\stackoverflow\axis2c-x86_64-google

我在目录中打开命令提示符echo并输入:

gcc -IC:\develop\stackoverflow\axis2c-x86_64-google\include\axis2-1.6.0 -c echo.c -o echo.o

我告诉gcc编译echo.cecho.o,并且它应该在C:\develop\stackoverflow\axis2c-x86_64-google\include\axis2-1.6.0. (要基本了解如何使用 GCC 编译和链接程序,我建议您阅读本教程)。

我收到编译器警告:

警告 请在 windows.h 之前包含 winsock2.h

但这不是错误,因此出于演示的目的,我不会担心它。

接下来,我想将echo.o我刚刚构建的axis2cDLL 与创建一个名为axis2c-echo.exe. 所以我输入:

gcc -o axis2c-echo.exe echo.o  -LC:\develop\stackoverflow\axis2c-x86_64-google\lib  -laxiom -laxutil -laxis2_engine -laxis2_parser

我说gcc除了目标文件之外echo.o,程序还需要链接库(-laxiom、、和axutil,并且链接器应该在.axis2_engineaxis2_parserC:\develop\stackoverflow\axis2c-x86_64-google\lib

请注意,我不需要告诉链接器,例如,axiom库 isaxiom.dll和 not axiom.libor libaxiom.a-laxiom告诉链接器在给定的搜索目录中查找其中的任何一个,如果它碰巧找到一个动态库 ( axiom.dll),它将更喜欢它而不是任何静态库axiom.liblibaxiom.a. 实际上,C:\develop\stackoverflow\axis2c-x86_64-google\lib它会同时找到axiom.dlland axiom.lib,并且更喜欢前者;但你不需要关心。

链接命令成功,所以现在我有一个程序,axis2c-echo.exe在同一目录中。我会运行它:

axis2c-echo

但我不能。我只是得到一个 Windows 错误对话框,上面写着:

该程序无法启动,因为您的计算机缺少 axiom.dll。尝试重新安装程序以修复此错误。

问题是axiom.dll链接自C:\develop\stackoverflow\axis2c-x86_64-google\lib,这不是程序加载器在运行时搜索 DLL 的地方之一。

现在,如果我打算axis2c在我的计算机上定期运行程序,我会通过在 中安装 64 位axis2cDLL来解决这个问题C:\Windows\SysWOW64,因为 64 位 Windows 总是在那里搜索 DLL。但我不打算这样做,所以我只是暂时添加C:\develop\stackoverflow\axis2c-x86_64-google\lib到 Windows DLL 搜索路径。Windows DLL 搜索路径的最后一站是:PATH 环境变量中列出的目录。所以在我的命令提示符下,我将输入:

set PATH=%PATH%;C:\develop\stackoverflow\axis2c-x86_64-google\lib

然后axis2c-echo再次运行。这一次,输出是:

AXIS2C_HOME 未设置 - 日志已写入。dir 使用端点:http://localhost:9090/axis2/services/echo 创建服务客户端时出错,请再次检查 AXIS2C_HOME

现在程序本身在抱怨,但这对我来说已经足够了!它已经编译、链接、加载、产生了一些输出并优雅地完成了。

现在可能很明显,您将如何设置 Code::Blocks 项目来构建相同的程序:

  • echo在目录中创建一个 C 语言控制台项目。
  • 从项目中删除默认main.c源文件
  • 将单个源文件添加echo.c到项目中。
  • 在项目的构建选项->搜索目录->编译器中,添加C:\develop\stackoverflow\axis2c-x86_64-google\include\axis2-1.6.0 (或path\to\your\axis2c-1.6.0\header-files
  • 在项目的构建选项->搜索目录->链接器中,添加C:\develop\stackoverflow\axis2c-x86_64-google\lib (或path\to\your\axis2c-1.6.0\libraries
  • 在项目的Build options -> Linker settings -> Other linker options中,添加-laxiom -laxutil -laxis2_engine -laxis2_parser

这不是您可以在 C::B 中成功配置此项目的唯一方法,但它对应于某人通常在命令提示符下构建项目的方式,这意味着 C::B 执行的工具链命令将是简洁和正常的外观。

如果您按照这些步骤构建示例echo项目,那么成功配置您自己的项目应该不会有太大困难。

于 2015-03-01T17:52:55.850 回答
0

您的项目包含 5 个源文件,每个源文件都必须成功编译,然后都需要链接在一起,连同一些axis2cDLL,以构建您的程序。

让我们看看你的构建日志。

5 个源文件中的每一个都有一个编译命令:

mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\adb_addOperatorResponse.c -o obj\Debug\adb_addOperatorResponse.o
...
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\axis2_extension_mapper.c -o obj\Debug\axis2_extension_mapper.o
...
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\axis2_stub_MathService.c -o obj\Debug\axis2_stub_MathService.o
...
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\main.c -o obj\Debug\main.o
...
mingw32-gcc.exe -Wall  -g    -IC:\Tools\axis2c\include -IE:\dev\CodeBlocks\MinGW  -c E:\dev\c\Math\adb_addOperator.c -o obj\Debug\adb_addOperator.o
...

然后有一个链接命令:

mingw32-g++.exe -LC:\Tools\axis2c\include -LE:\dev\CodeBlocks\MinGW\lib  -o bin\Debug\Math.exe obj\Debug\adb_addOperatorResponse.o obj\Debug\axis2_extension_mapper.o obj\Debug\axis2_stub_MathService.o obj\Debug\main.o obj\Debug\adb_addOperator.o   -laxiom -laxutil -laxis2_engine -laxis2_parser
...

将这些命令复制/粘贴到您可以从头到尾看到它们的地方。

在我放置“...”的所有地方,编译器或链接器都对您的程序发出了一些抱怨。

5 个编译命令发出的所有诊断信息都是警告。无论什么不对,它实际上都不会阻止编译器将源文件 ( .c) 编译成目标文件 ( .o)。如果任何文件中存在任何编译错误.c,则编译器将无法创建该.o文件,并且构建将停止而不尝试链接程序,因为在缺少某些目标文件时链接它是徒劳的。

这并不意味着您不必担心编译器警告。它们可能是关于程序中可能存在的错误的警告,其中一些是. 所以你需要修复它们。

链接命令失败。你没有程序,这是你的首要问题。

为了理解编译器和链接器诊断并能够自己修复它们,您需要了解编译器和链接器命令的含义。

我们可以看到,为您驱动的工具链 Code::Blocks 是 MinGW 项目的GCC (The GNU Compiler Collection)的 32 位 Windows 端口。GCC 是 C/C++ 编程工具链之父:每个操作系统和每个处理器都支持它;它用于每个应用程序域。它完全独立于您可以驱动它的众多 IDE 中的任何一个,并且所有这些 IDE(Eclipse、Code::Blocks、KDevelop、CodeLite、Anjuta、Dev-C++ 等)都带有隐含的假设。您了解使用 GCC 进行编译和链接。至少,它们中的任何一个都不能使不必了解使用 GCC 进行编译和链接。

在继续之前,这一切的人生教训将是:暂时离开你的 IDE。了解如何使用 GCC 本身构建程序。 然后很明显如何使用您的 IDE 进行操作。

您的所有编译命令都由mingw32-gcc.exe. 那就是 GCC 工具驱动程序,在它的C 编译器“姿势”中。如果您查看它的安装目录,也许C:\MinGW\bin您还会看到程序gcc.exe,,g++.exe以及带有前缀的那两个mingw32-。所有这些程序都是GCC工具驱动,以不同的“姿势”适应不同的角色。

您的链接命令由mingw32-g++.exe. 这又是 GCC 工具驱动程序,在它的C++ 链接器“姿势”中。Code::Blocks 默认配置C++链接器以链接C程序,这似乎令人费解。这样做是因为 C++ 链接适用于全 C、全 C++ 或两者混合的程序。但是 C 链接不适用于 C++ 程序。

无论名称暗示什么“姿势”,GCC 工具驱动程序通过检查其命令行上的选项和传递给它的文件的文件扩展名来确定需要做什么。因此它会尝试将每个.c源文件编译为 C ,因为它们是.c文件。如果它们是.cpp文件,那么它将尝试将它们编译为 C++。一旦它弄清楚它做了什么,它就会将工作委托给适当的专用工具——C 编译器、C++ 编译器、汇编器、链接器。

以下是每个编译命令的含义:

  • -Wall=> 启用所有警告
  • -g=> 在目标文件中生成调试信息。
  • -IC:\Tools\axis2c\include=> 在中搜索非标准头文件C:\Tools\axis2c\include
  • -IE:\dev\CodeBlocks\MinGW=> 还要搜索非标准头文件E:\dev\CodeBlocks\MinGW
  • -c=> 只需编译;不要链接
  • E:\dev\c\Math\some_filename.c=> 编译这个文件。
  • -o obj\Debug\some_filename.o=> 输出目标文件obj\Debug\some_filename.o

这就是您的链接命令的含义:

  • -LC:\Tools\axis2c\include=> 在中搜索非标准库(.lib, .a, .dllC:\Tools\axis2c\include
  • -LE:\dev\CodeBlocks\MinGW\lib=> 同时搜索非标准库E:\dev\CodeBlocks\MinGW\lib
  • -o bin\Debug\Math.exe=> 输出可执行文件bin\Debug\Math.exe
  • obj\Debug\adb_addOperatorResponse.o=> 链接这个目标文件
  • obj\Debug\axis2_extension_mapper.o=> 同时链接这个目标文件
  • obj\Debug\axis2_stub_MathService.o=> 同时链接这个目标文件
  • obj\Debug\main.o=> 同时链接这个目标文件
  • obj\Debug\adb_addOperator.o=> 同时链接这个目标文件
  • -laxiom=> 链接库axiom.dll或失败,axiom.lib或者libaxiom.a,在指定的链接器搜索目录 ( ) 中首次找到它-L,或者在链接器的标准目录中失败。
  • -laxutil=>链接库axutil.dll或失败,axutil.lib或者libaxutil.a,等等......
  • -laxis2_engine=>链接库axis2_engine.dll或失败,axis2_engine.lib或者libaxis2_engine.a,等等......
  • -laxis2_parser=>链接库axis2_parser.dll或失败,axis2_parser.lib或者libaaxis2_parser.a,等等......

您可能想知道工具驱动程序如何知道链接命令链接命令,而不是 C++ 编译命令?它知道没有编译要做,因为没有一个输入文件可以被编译。它们都是目标文件 ( .o)。它知道它应该链接它们,因为它没有被告知不要链接它们:该-c选项不存在。

您的链接失败是因为:

e:/dev/codeblocks/mingw/bin/../lib/gcc/mingw32/4.4.1/../../../../mingw32/bin/ld.exe: cannot find -laxiom

ld.exe是链接器本身:GCC 工具驱动程序在需要完成链接时调用的专用工具。它无法axiom在您指定的任何链接器搜索目录 ( ) 中找到您的库,-L当然也无法在任何标准搜索目录中找到。

现在您了解了链接命令的含义,您将很容易看出哪里出了问题。您指定的链接器搜索目录是:

C:\Tools\axis2c\include
E:\dev\CodeBlocks\MinGW\lib

并且您的axis2c图书馆(axiom.dll等)不在这些地方。是您告诉编译器搜索头文件C:\Tools\axis2c\include 的同一个地方:您有:axis2c

-IC:\Tools\axis2c\include

因此,如果那是axis2c头文件所在的位置,那么我猜这些库位于C:\Tools\axis2c\lib. 看一看。假设这是正确的,那么在 C::B IDE 中,您需要C:\Tools\axis2c\includeSearch 目录-> Linker 为您的项目删除错误,并将其替换为正确的C:\Tools\axis2c\libLeave C:\Tools\axis2c\includein Search 目录-> Compiler,因为这是正确的。

继续 OP 的其他问题

我相信您的axis2c库和头文件来自 存档中的 Apache 的 Axis2/C 下载页面axis2c-bin-1.6.0-win32.zip

此版本存在头文件中的错误,导致您在使用 MinGW32 工具链时看到的链接错误。

这个错误不会影响我在第一次回答这个问题时提到的谷歌发布的 Axis2/C 。当时您说您正在使用 64 位 MinGW 构建,但后来很明显您正在使用 32 位 MinGW 构建。在这种情况下,您应该下载Google 的 32 位版本 Axis2/C

使用 7-Zip 解压缩存档并将解压缩的文件夹从 重命名axis2caxis2c-x86-google,以明确它是什么,然后将其复制到便于开发的地方。假设你把它放在C:\Tools\axis2c-x86-google.

然后在 C::B IDE 的Search directory -> Compiler中,更改:

C:\Tools\axis2c\include

至:

C:\Tools\axis2c-x86-google\include\axis2-1.6.0

并在Search directory -> Linker中,更改:

C:\Tools\axis2c\lib

至:

C:\Tools\axis2c-x86-google\lib

axiom.dll在 Apache 版本中调用的库axis2_axiom.dll在 Google 的版本中调用。因此,在您的Linker settings -> Other linker options中,更改:

-laxiom

至:

-laxis2_axiom

然后您的程序成功链接(对我而言)。

再次继续

根据您的评论,该程序现在无法在运行时加载并出现错误:

The procedure entry point axis2_callback_create could not be located in the dynamic link library

这意味着axis2_callback_create在运行时找不到正确的 DLL 提供。

你说:

我还将“lib”添加到路径环境中。并将 lib dll 文件添加到“C:\Windows\SysWOW64”

  • 做一个或另一个,而不是两个。
  • 根据您将 Axis2/C 库目录添加到PATH.
    • 如果您在与您尝试运行程序的窗口不同的 shell(命令提示符)窗口中执行此操作,那么它将没有任何效果,因为您在 shell 中进行的环境设置仅适用于启动的进程在同一个外壳中。
    • 如果您通过修改PATH高级系统设置中的环境变量来执行此操作,那么这对您尝试运行程序的已打开的 shell 没有影响。您需要保存高级系统设置,然后再次尝试在新的 shell 中运行您的程序。

我可以通过以下所有方式启动您的程序而不会出现 DLL 错误:

  • C:\Tools\axis2c-x86-google\lib\*.dll与位于同一目录中的所有文件Math.exe
  • 所有文件都C:\Tools\axis2c-x86-google\lib\*.dll位于C:Windows\SysWOW64
  • 在我之前运行过的 shell 窗口中:set PATH=%PATH%;C:\path\to\my\axis2c-x86-google\lib
  • 在高级系统设置中添加环境变量后C:\path\to\my\axis2c-x86-google\lib,在新的 shell中。PATH

如果它们都不适合您,那么恐怕问题超出了我的范围:(

于 2015-03-02T19:44:41.223 回答