g ++ - этап связывания (флаг -L) не работает - PullRequest
0 голосов
/ 13 ноября 2018

Я новичок в C ++ и пытаюсь выяснить, где в процессе компиляции моя ошибка.Извините, если этот вопрос неясен, я не уверен, какую информацию предоставить.

Справочная информация: Каталог "mbedtls / lib /" содержит два файла .a (архива), "libmbedtls_SGX_t.a" и"libmbedtls_SGX_u.a".

Я использую Makefile, который выполняет следующие команды по порядку.Кажется, что команды выполняются без ошибок:

cc -m64 -O2 -fPIC -Wno-attributes -IApp -I/opt/intel/sgxsdk/include -Imbedtls/include -DNDEBUG -UEDEBUG -UDEBUG -c App/Enclave_u.c -o App/Enclave_u.o
g++ -m64 -O2 -fPIC -Wno-attributes -IApp -I/opt/intel/sgxsdk/include -Imbedtls/include -DNDEBUG -UEDEBUG -UDEBUG -std=c++11 -c App/App.cpp -o App/App.o
g++ -m64 -O2 -fPIC -Wno-attributes -IApp -I/opt/intel/sgxsdk/include -Imbedtls/include -DNDEBUG -UEDEBUG -UDEBUG -std=c++11 -c App/sgx_utils/sgx_utils.cpp -o App/sgx_utils/sgx_utils.o

После выполнения этих команд запускается эта команда:

g++ App/Enclave_u.o App/App.o App/sgx_utils/sgx_utils.o -o app -m64 -O2 -L/opt/intel/sgxsdk/lib64 -lsgx_urts_sim -lpthread -Lmbedtls/lib/ -lsgx_uae_service_sim

Однако эта команда выдает ошибку:

App/Enclave_u.o: In function `Enclave_ocall_print_string':
Enclave_u.c:(.text+0x9): undefined reference to `ocall_print_string'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_free':
Enclave_u.c:(.text+0x28): undefined reference to `ocall_mbedtls_net_free'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_recv_timeout':
Enclave_u.c:(.text+0x54): undefined reference to `ocall_mbedtls_net_recv_timeout'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_send':
Enclave_u.c:(.text+0x71): undefined reference to `ocall_mbedtls_net_send'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_recv':
Enclave_u.c:(.text+0x91): undefined reference to `ocall_mbedtls_net_recv'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_usleep':
Enclave_u.c:(.text+0xa8): undefined reference to `ocall_mbedtls_net_usleep'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_set_nonblock':
Enclave_u.c:(.text+0xc9): undefined reference to `ocall_mbedtls_net_set_nonblock'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_set_block':
Enclave_u.c:(.text+0xe9): undefined reference to `ocall_mbedtls_net_set_block'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_accept':
Enclave_u.c:(.text+0x119): undefined reference to `ocall_mbedtls_net_accept'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_bind':
Enclave_u.c:(.text+0x144): undefined reference to `ocall_mbedtls_net_bind'
App/Enclave_u.o: In function `Enclave_ocall_mbedtls_net_connect':
Enclave_u.c:(.text+0x164): undefined reference to `ocall_mbedtls_net_connect'
collect2: error: ld returned 1 exit status
Makefile:184: recipe for target 'app' failed

Я не знаю, почему возникает эта ошибка.Моя последняя команда включает флаг -Lmbedtls/lib/, который должен разрешать эти неопределенные ссылки, связывая архивные файлы (в частности - libmbedtls_SGX_u.a) с исполняемым файлом.Однако явно этого не происходит.

Нужно ли связывать архивные файлы ранее в процессе компиляции?Т.е. вместо использования флага -Lmbedtls/lib/ в последней команде g ++, следует ли мне использовать его в обеих предыдущих командах g ++?

Обновление: Добавление флага -Lmbedtls/lib/ к предыдущим командам 2 g ++ (те, которые генерировали App.o и sgx_utils.o) ничего не изменило.Ошибка остается.

1 Ответ

0 голосов
/ 13 ноября 2018

Как уже упоминалось в комментарии, указывать каталог с -L без указания имени библиотеки в этом каталоге бесполезно.

Таким образом, вы должны дополнительно указать имена библиотек с помощью -l.

Так что вместо:

g++ App/Enclave_u.o App/App.o App/sgx_utils/sgx_utils.o -o app -m64 -O2 \
   -L/opt/intel/sgxsdk/lib64 -lsgx_urts_sim -lpthread \
   -Lmbedtls/lib/ \
   -lsgx_uae_service_sim

Использование:

g++ App/Enclave_u.o App/App.o App/sgx_utils/sgx_utils.o -o app -m64 -O2 \
   -L/opt/intel/sgxsdk/lib64 -lsgx_urts_sim -lpthread \
   -Lmbedtls/lib/ -lmbedtls_SGX_t -lmbedtls_SGX_u \
   -lsgx_uae_service_sim
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...