Не удалось найти точку входа в процедуру axiom_attribute_create в библиотеке динамических ссылок
У меня есть проект на C, и я хочу скомпилировать его в CodeBlocks с MinGW. Я пытался связать необходимые библиотеки, но я получил
неопределенная ошибка ссылки
поэтому я искал и обнаружил, что библиотеки, которые я использовал, были скомпилированы с MVC++ и не могут использоваться с MinGW. (Я не эксперт в c, поэтому я немного растерялся.) Я нашел эту ссылку и сделал то, что они сказали, чтобы решить мою проблему.
Я создал файлы axis2c .a из исходных файлов axis2c .dll.
- Я создал.def файлы с reimp
- затем я изменил каждую функцию stdcall в файлах.def (я изменил "_name@ordinal" на "name")
- затем я использовал dlltool для создания.a файлов.
Я связал файлы.a с моим проектом. Все прошло хорошо, и я смог скомпилировать свой проект. но когда я пытаюсь запустить его. Я получаю эту ошибку.
Не удалось найти точку входа в процедуру axiom_attribute_create в библиотеке динамических ссылок
Я включил свой проект в эту ссылку.
Я загрузил CodeBlocks с MinGW. codeblocks-10.05mingw-setup.exe (который, я думаю, использует MinGw32bit). Затем я следовал инструкциям @mikekinghan, чтобы настроить параметры сборки. Затем я построил проект. Я получил эту ошибку. Я уже добавил папку Axis2c lib в путь Environment. (Я даже скопировал axiom.dll в "C:\Windows\SysWOW64", как предложено @mikekinghan.
Вот журнал сборки:
-------------- 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 пытался научить меня, я теперь понимаю значение команд Linker и вижу, что Linker настроен правильно на этот раз. но почему он не может правильно скомпилироваться?
2 ответа
Ваш проект содержит 5 исходных файлов, каждый из которых должен быть успешно скомпилирован, а затем все должны быть связаны вместе, вместе с некоторыми 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
...
и затем есть команда ссылки:
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 для вас является 32-битным портом Windows GCC проекта MinGW (Коллекция компиляторов GNU). 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, в его " Cure " компоновщике 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
А вот что означает ваша команда link:
-LC:\Tools\axis2c\include
=> Поиск нестандартных библиотек (.lib
,.a
,.dll
) вC:\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
, так далее...
Вы можете задаться вопросом, откуда драйвер инструмента знает, что команда link является командой link, а не командой компиляции 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\include
из Поиск каталогов -> Линкер для вашего проекта и замените его на правильный C:\Tools\axis2c\lib
Покидать C:\Tools\axis2c\include
в каталогах поиска -> компилятор, потому что это правильно.
Продолжение для дальнейших вопросов ОП
Я считаю, что ваш axis2c
библиотеки и заголовочные файлы, созданные на странице загрузки Apache Axis2/C из архива axis2c-bin-1.6.0-win32.zip
,
Этот выпуск страдает от ошибки в заголовочных файлах, которая вызывает ошибки компоновки, которые вы видите с помощью цепочки инструментов MinGW32.
Эта ошибка не влияет на выпуск Google Axis2/C, о котором я говорил в моем первом ответе на этот вопрос. В то время вы говорили, что строите с 64-битным MinGW, но с тех пор стало ясно, что вы строите с 32-битным MinGW. В этом случае вам следует загрузить 32-битную сборку Google Axis2/C
Распакуйте архив с 7-Zip и переименуйте разархивированную папку из axis2c
в axis2c-x86-google
, чтобы понять, что это такое, а затем скопировать его в удобное для вас место. Допустим, вы положили его в C:\Tools\axis2c-x86-google
,
Затем в C::B IDE, в директориях поиска -> Compiler, измените:
C:\Tools\axis2c\include
чтобы:
C:\Tools\axis2c-x86-google\include\axis2-1.6.0
а в Поисках каталогов -> Линкер, поменяй
C:\Tools\axis2c\lib
чтобы:
C:\Tools\axis2c-x86-google\lib
Библиотека, которая называется axiom.dll
в релизе Apache называется axis2_axiom.dll
в выпуске Google. Поэтому в настройках линкера -> Другие опции линкера измените:
-laxiom
чтобы:
-laxis2_axiom
Ваша программа тогда ссылки успешно (для меня).
Продолжение снова
Согласно вашим комментариям, программа теперь не может загружаться во время выполнения с ошибкой:
The procedure entry point axis2_callback_create could not be located in the dynamic link library
Это означает правильное предоставление DLL axis2_callback_create
не найден во время выполнения.
Ты говоришь:
Я также добавил "lib" в путь path. а также добавил файлы lib dll в "C:\Windows\SysWOW64"
- Делайте одно или другое, а не оба.
- В зависимости от того, что вы сделали, чтобы добавить каталог библиотеки Axis2/C в
PATH
Возможно, это не имело никакого эффекта.- Если вы сделали это в окне оболочки (командной строки), которое не было тем же, в котором вы пытались запустить вашу программу, то это не будет иметь никакого эффекта, поскольку параметры среды, которые вы задаете в оболочке, применяются только к запущенным процессам. в той же оболочке.
- Если вы сделали это, изменив
PATH
переменная окружения в расширенных системных настройках, которая не повлияет на уже открытую оболочку, в которой вы пытались запустить программу. Вам нужно сохранить Advanced System Settings и затем снова попытаться запустить вашу программу в новой оболочке.
Я могу запустить вашу программу без ошибок DLL всеми следующими способами:
- Со всеми файлами
C:\Tools\axis2c-x86-google\lib\*.dll
находится в одном каталоге сMath.exe
- Со всеми файлами
C:\Tools\axis2c-x86-google\lib\*.dll
расположен вместоC:Windows\SysWOW64
- В окне оболочки, в котором я ранее запускал:
set PATH=%PATH%;C:\path\to\my\axis2c-x86-google\lib
- В новой оболочке после того, как я добавил
C:\path\to\my\axis2c-x86-google\lib
кPATH
переменная окружения в расширенных системных настройках.
Если ни один из них не работает для вас, то я боюсь, что проблема за мной:(
Я не слежу за обоснованием шагов, которые вы предприняли, и не имею конкретных данных о том, что вы сделали, так что это ответ "из первых принципов".
Если вы хотите связать DLL foo.dll
с вашей программой, используя компоновщик Microsoft (что вы не делаете), вы не можете передать foo.dll
прямо к компоновщику. Как вы знаете, вместо этого вы должны передать библиотеку импорта, foo.lib
, которая представляет собой небольшую статическую библиотеку "заглушек", представляющих функции, которые экспортируются foo.dll
, Во время выполнения загрузчик программы сканирует эти заглушки и (если возможно) заменяет их соответствующими ссылками на экспортированные функции, которые он находит путем поиска доступных DLL в соответствии с путем поиска DLL Windows.
Если вы хотите связать foo.dll
с вашей программой, используя компоновщик MinGW GNU (что вы делаете), нет библиотеки импорта foo.lib
является необходимым. Этот линкер может ссылаться foo.dll
непосредственно. У вас нет причин поступать иначе.
Связывать foo.dll
непосредственно с вашей программой с использованием компоновщика MinGW GNU, компоновщик, конечно, должен быть в состоянии найти foo.dll
во время компоновки по правилам, которым следует искать библиотеки, статические или динамические. И так же, как с компоновщиком Microsoft, успешное связывание DLL не гарантирует, что DLL также будет найдена во время выполнения загрузчиком программы. Загрузчик программы выполняет поиск библиотек DLL в соответствии с путем поиска Windows DLL: он не знает и не заботится о том, какой компоновщик вы использовали для связи своей программы. Вы должны убедиться, что компоновщик найдет DLL во время компоновки, а затем вам нужно убедиться, что загрузчик программы найдет ее во время выполнения.
Как вы скажете компоновщику MinGW ссылку foo.dll
напрямую? Вы просто следуете правилам передачи библиотек компоновщику, как описано здесь.
Но прежде чем попытаться сделать это, нужно выполнить еще одно базовое условие. Вы не можете связать 32-битную DLL с 64-битной программой или наоборот. Вы говорите, что строите с 64-битным MinGW; поэтому по умолчанию он будет создавать 64-битные исполняемые файлы, а если вы создаете 64-битные .exe
тогда вы должны связать его с 64-битными сборками axis2c
Библиотеки DLL.
Я не знаю, где ты взял свой axis2c
библиотеки, но если вы скачали бинарный архив Apache v1.6.0, то у вас есть 32-битные библиотеки DLL.
Вы можете сказать своему 64-битному MinGW построить 32-битный .exe
, но вы, вероятно, предпочли бы связать его с 64-битным axis2c
Библиотеки DLL. К счастью, 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. У меня есть 64-битный axis2c
пакет загружен, разархивирован и переименован в C:\develop\stackru\axis2c-x86_64-google
Я открываю командную строку в echo
каталог и введите:
gcc -IC:\develop\stackru\axis2c-x86_64-google\include\axis2-1.6.0 -c echo.c -o echo.o
я говорю gcc
Скомпилировать echo.c
в echo.o
и что он должен искать нестандартные заголовочные файлы в C:\develop\stackru\axis2c-x86_64-google\include\axis2-1.6.0
, (Чтобы понять, как скомпилировать и связать программы с GCC, я предлагаю вам прочитать этот учебник).
Я получаю предупреждение компилятора:
предупреждение Пожалуйста, включите winsock2.h перед windows.h
но это не ошибка, поэтому я не буду беспокоиться об этом в целях этой демонстрации.
Далее я хочу связать echo.o
Я только что построил с axis2c
DLL, которые необходимы для создания программы под названием axis2c-echo.exe
, Итак, я вхожу:
gcc -o axis2c-echo.exe echo.o -LC:\develop\stackru\axis2c-x86_64-google\lib -laxiom -laxutil -laxis2_engine -laxis2_parser
я говорю gcc
что помимо объектного файла echo.o
, программе нужно связать библиотеки (-l
) axiom
, axutil
, axis2_engine
а также axis2_parser
и что компоновщик должен искать нестандартные библиотеки в C:\develop\stackru\axis2c-x86_64-google\lib
,
Обратите внимание, что мне не нужно сообщать компоновщику, что, скажем, axiom
библиотека axiom.dll
и не axiom.lib
или же libaxiom.a
, -laxiom
говорит компоновщику искать любой из них в заданном каталоге поиска и, если это происходит, находит динамическую библиотеку (axiom.dll
) он предпочтет это любой статической библиотеке axiom.lib
или же libaxiom.a
, В C:\develop\stackru\axis2c-x86_64-google\lib
это на самом деле найдет оба axiom.dll
а также axiom.lib
и предпочитаю первое; но вам не нужно заботиться.
Команда linkage выполнена успешно, так что теперь у меня есть программа, axis2c-echo.exe
в том же каталоге. Я буду управлять этим:
axis2c-echo
Но я не могу. Я просто получаю диалог ошибки Windows, который говорит:
Эта программа не может запуститься, потому что axiom.dll отсутствует на вашем компьютере. Попробуйте переустановить программу, чтобы исправить эту ошибку.
Проблема в том, что axiom.dll
был связан с C:\develop\stackru\axis2c-x86_64-google\lib
, что не является одним из мест, где загрузчик программы ищет библиотеки DLL во время выполнения.
Вот если бы я планировал регулярно бегать axis2c
программы на моем компьютере, я бы решил эту проблему, установив 64-разрядную версию axis2c
DLL в C:\Windows\SysWOW64
потому что 64-битная Windows всегда ищет там DLL-библиотеки. Но я не планирую этого делать, поэтому вместо этого я просто временно добавлю C:\develop\stackru\axis2c-x86_64-google\lib
к пути поиска Windows DLL. Последняя остановка на пути поиска Windows DLL: Каталоги, перечисленные в переменной среды PATH. Поэтому в моей командной строке я введу:
set PATH=%PATH%;C:\develop\stackru\axis2c-x86_64-google\lib
а потом беги axis2c-echo
снова. На этот раз вывод:
AXIS2C_HOME не установлен - журнал записывается в. dir Использование конечной точки: http://localhost:9090/axis2/services/echo Ошибка создания клиента службы, пожалуйста, проверьте AXIS2C_HOME еще раз
Сейчас сама программа жалуется, но для меня этого достаточно! Он скомпилировал, связал, загрузил, произвел некоторый вывод и закончил изящно.
Теперь, вероятно, очевидно, как бы вы настроили проект Code::Blocks для сборки этой же программы:
- Создайте консольный проект на языке C в
echo
каталог. - Удалить по умолчанию
main.c
исходный файл из проекта - Добавить единственный исходный файл
echo.c
к проекту. - В настройках проекта -> Поиск по каталогам -> Компилятор, добавьте
C:\develop\stackru\axis2c-x86_64-google\include\axis2-1.6.0
(или жеpath\to\your\axis2c-1.6.0\header-files
) - В опциях сборки проекта -> Поиск по каталогам -> Linker, добавьте
C:\develop\stackru\axis2c-x86_64-google\lib
(или жеpath\to\your\axis2c-1.6.0\libraries
) - В опциях сборки проекта -> Настройки компоновщика -> Другие опции компоновщика добавьте
-laxiom -laxutil -laxis2_engine -laxis2_parser
Это не единственный способ, которым вы можете успешно настроить этот проект в C::B, но он соответствует тому, как кто-то обычно строит проект из командной строки, и означает, что команды набора инструментов, которые выполняет C::B, будут сжатый и нормальный вид.
Если вы выполните следующие шаги, чтобы построить пример echo
Проект, у вас не должно быть особых трудностей при успешной настройке вашего собственного проекта.