g ++-链接阶段(-L标志)不起作用

时间:2018-11-12 22:11:19

标签: c++ g++ static-libraries static-linking sgx

我是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)链接到可执行文件来解析这些未定义的引用。但是,显然这没有发生。

在编译过程中是否需要链接归档文件?即-我应该在之前的两个g ++命令中都使用它,而不是在最终的g ++命令中使用标志-Lmbedtls/lib/

更新:将标志-Lmbedtls/lib/添加到前面的2条g ++命令(生成App.o和sgx_utils.o的命令)没有任何改变。错误仍然存​​在。

1 个答案:

答案 0 :(得分:2)

正如评论中提到的那样,仅用-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