无法在动态 link 库中找到过程入口点 axiom_attribute_create

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

我有一个 c 语言的项目,我想用 MinGW 在 CodeBlocks 中编译它。 我尝试 link 它需要的库,但我得到了

undefined reference error

所以我搜索了一下,发现我用的库是用MVC++编译的,不能用在MinGW上。 (我不是c专家,所以我有点困惑。)我找到了This link并按照他们说的做了,以解决我的问题。

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

我link将 .a 文件编辑到我的项目中。一切顺利,我可以编译我的项目。但是当我尝试 运行 时。我收到此错误。

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

我已将我的项目包含在此Link

我用 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 放在 Search Directories>Linker 中是错误的,我修正了那个错误。

我构建项目然后我得到这个:

-------------- 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 试图教我的内容,我现在理解了链接器命令的含义,并且我看到这次链接器设置正确。但为什么不能正确编译?

我不理解你采取的步骤背后的原因,也不 有关于你所做的任何具体数据,所以这是一个答案 "from first principles"。

如果您想 link 一个 DLL foo.dll 与您的程序一起使用 Microsoft 的 linker(您是 做)你不能 将 foo.dll 直接传递给 linker。如您所知,您必须改为传递 importfoo.lib,它是 "stubs" 的小型静态库,表示 foo.dll 导出的函数。在运行时, 程序加载器扫描这些存根并(如果可能)用匹配的引用替换它们 根据 the Windows DLL Search Path

通过搜索可用的 DLL 找到的导出函数

如果你想 link foo.dll 使用 MinGW GNU linker 的程序(你 正在 做),不 导入库 foo.lib 是必要的。这个linker可以直接linkfoo.dll。你没有理由 否则做。

为了linkfoo.dll直接用你的程序使用MinGW GNUlinker,linker,当然, 必须能够根据查找库所遵循的规则在 link 时间找到 foo.dll,无论是静态的还是 动态的。就像 Microsoft 的 linker 一样,DLL 的成功 linkage 并不能保证 DLL 程序加载器也会在 运行time 找到。程序加载器根据以下条件搜索 DLL Windows DLL 搜索路径:它不知道也不关心您使用哪个 linker 来 link 您的程序。你 必须确保 linker 在 link 时找到 DLL,然后您需要确保程序 加载程序将在 运行 时间找到它。

你如何告诉 MinGW linker 直接 link foo.dll?您只需遵循将库传递给的规则 linker,如 documented here.

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

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

您可以告诉您的 64 位 MinGW 构建 32 位 .exe,但您可能更愿意 link 它与 64 位 axis2c DLL。幸运的是, Google 提供了 64 位版本。从 here 下载。 64 位存档是 x86_64-wsdk7.1-r7acae470da50.7z。 在方便的地方下载它;使用 7-Zip 提取它,然后我建议您将提取的文件夹重命名为可以识别它的名称 很明显,比如 axis2c-x86_64-google.

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

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

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

我告诉 gccecho.c 编译为 echo.o,它应该搜索非标准头文件 在 C:\develop\Whosebug\axis2c-x86_64-google\include\axis2-1.6.0。 (基本上了解如何编译和 link 使用 GCC 的程序,我建议你阅读 this tutorial).

我收到编译器警告:

warning Please include winsock2.h before windows.h

但这不是 错误,所以为了演示的目的我不会担心它。

接下来,我想 link 我刚刚用 axis2c DLL 构建的 echo.o 它需要 制作一个名为 axis2c-echo.exe 的程序。所以我输入:

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

我告诉 gcc 除了目标文件 echo.o,程序还需要 link 库 (-l) axiom, axutilaxis2_engineaxis2_parser、 linker 应该在 C:\develop\Whosebug\axis2c-x86_64-google\lib.

中寻找非标准库

请注意,我不需要告诉 linker axiom 库是 axiom.dll 而不是 axiom.liblibaxiom.a. -laxiom 告诉 linker 在给定的搜索目录中查找其中的 any,如果它碰巧找到动态库 (axiom.dll),它将优先于任何静态库 图书馆 axiom.liblibaxiom.a。在 C:\develop\Whosebug\axis2c-x86_64-google\lib 中,它实际上会同时找到 axiom.dllaxiom.lib, 并且更喜欢前者;但你不需要关心。

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

axis2c-echo

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

This program can't start because axiom.dll is missing from your computer. Try reinstalling the program to fix this error.

问题是 axiom.dll 是 link 从 C:\develop\Whosebug\axis2c-x86_64-google\lib 编辑而来的,这不是其中之一 程序加载器在 运行 时间搜索 DLL 的地方。

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

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

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

AXIS2C_HOME is not set - log is written to . dir Using endpoint : http://localhost:9090/axis2/services/echo Error creating service client, Please check AXIS2C_HOME again

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

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

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

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

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

您的项目包含5个源文件,每个都必须编译成功,然后全部 需要 link 连同一些 axis2c DLL 来构建您的程序。

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

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
...

然后有一个link命令:

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
...

Copy/paste 这些命令在您可以从头到尾看到它们的地方。

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

5 个编译命令发出的所有诊断都是警告。无论哪里不对,它实际上并没有阻止编译器编译源代码 文件 (.c) 到目标文件 (.o)。如果在任何 .c 文件中存在任何编译 错误 ,那么编译器将无法创建 .o 文件, 并且构建会在不尝试 link 程序的情况下停止,因为当某些目标文件丢失时 link 对它进行编译是徒劳的。

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

link 命令失败。你没有程序,这是你的头号问题。

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

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

在继续之前,所有这一切的人生教训将是:暂时停止你的 IDE。了解如何使用 GCC 本身构建程序。 然后很明显如何用你的 IDE.

来做

你所有的编译命令都被mingw32-gcc.exe执行了。那是 GCC 工具驱动程序,在其 C 编译器 "posture" 中。如果你查看它的安装目录, 也许 C:\MinGW\bin,您还会看到程序 gcc.exeg++.exe,加上前缀为 mingw32- 的那两个程序。所有这些程序 都是GCC工具驱动,在不同的"postures"适配不同的角色。

您的 link 命令由 mingw32-g++.exe 执行。这又是 GCC 工具驱动程序,在其 C++ linker "posture" 中。 Code::Blocks 似乎令人费解 默认配置 C++ linker 到 link C 程序。这样做是因为 C++ linkage 适用于全 C、全 C++ 或两者混合的程序。 但是 C linkage 不适用于 C++ 程序。

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

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

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

这就是您的 link 命令的含义:

  • -LC:\Tools\axis2c\include => 在C:\Tools\axis2c\include
  • 中搜索非标准库(.lib.a.dll
  • -LE:\dev\CodeBlocks\MinGW\lib => 同时在 E:\dev\CodeBlocks\MinGW\lib
  • 中搜索非标准库
  • -o bin\Debug\Math.exe => 输出可执行文件 bin\Debug\Math.exe
  • obj\Debug\adb_addOperatorResponse.o => Link 这个目标文件
  • obj\Debug\axis2_extension_mapper.o => 还有 link 这个对象文件
  • obj\Debug\axis2_stub_MathService.o => 还有 link 这个目标文件
  • obj\Debug\main.o => 还有 link 这个目标文件
  • obj\Debug\adb_addOperator.o => 还有 link 这个目标文件
  • -laxiom => Link 库 axiom.dll 或失败,axiom.liblibaxiom.a,在指定的 link呃 搜索目录 (-L),或者在 linker 的标准目录中搜索失败。
  • -laxutil => Link 库 axutil.dll 或失败,axutil.liblibaxutil.a,等等...
  • -laxis2_engine => Link 库 axis2_engine.dll 或失败,axis2_engine.liblibaxis2_engine.a,等等...
  • -laxis2_parser => Link 库 axis2_parser.dll 或失败,axis2_parser.liblibaaxis2_parser.a,等等...

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

您link年龄不合格,因为:

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

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

现在您已经理解了 link 命令的含义,您将很容易看出问题所在。 linker 您指定的搜索目录是:

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 中你需要从 Search directories -> [= 中删除错误的 C:\Tools\axis2c\include 347=]呃 为您的项目替换为正确的 C:\Tools\axis2c\libSearch directories -> Compiler 中保留 C:\Tools\axis2c\include, 因为那是正确的。

OP 的后续问题继续

我相信您的 axis2c 库和头文件源自 Apache's Axis2/C download page 来自存档 axis2c-bin-1.6.0-win32.zip.

此版本存在 bug in its header files 导致 linkage 错误 您看到的是 MinGW32 工具链。

此错误不会影响我向您推荐的 Google's release of Axis2/C 在我对这个问题的第一个回答中。当时您说您正在使用 64 位 MinGW 进行构建,但此后 弄清楚您正在使用 32 位 MinGW 进行构建。在这种情况下,您应该下载 Google's 32-bit build Axis2/C

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

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

C:\Tools\axis2c\include

至:

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

并在搜索目录 -> Linker,更改:

C:\Tools\axis2c\lib

至:

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

在 Apache 版本中称为 axiom.dll 的库在 Google 版本中称为 axis2_axiom.dll。所以 在你的 Linker settings -> Other linker options,更改:

-laxiom

至:

-laxis2_axiom

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

再续

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

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

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

你说:

I also added the "lib" to path environment. and also added the lib dll files to "C:\Windows\SysWOW64"

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

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

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

如果其中 none 对你有效,那么恐怕这个问题超出了我的范围:(