【问题标题】:Linking C files Error: linker command failed with exit code 1链接 C 文件错误:链接器命令失败,退出代码为 1
【发布时间】:2015-09-22 02:36:42
【问题描述】:

我有三个文件,rsa.c、prf.c 和 rsa-test.c。

我使用gcc -c rsa.cgcc -c prf.cgcc -c rsa-test.c 来获取.o 文件。

编辑:我在 rsa-test.c 中包含了 rsa.c 和 prf.c。

然后我使用gcc -o test rsa.o prf.o rsa-test.o 编译.o 文件。

编译时出现以下错误。 o 三个文件的文件。

Undefined symbols for architecture x86_64:
  "_EVP_sha512", referenced from:
      randBytes(unsigned char*, unsigned long) in prf.o
  "_HMAC", referenced from:
      randBytes(unsigned char*, unsigned long) in prf.o
  "_SHA512", referenced from:
      setSeed(unsigned char*, unsigned long) in prf.o
  "___gmpz_add_ui", referenced from:
      randBytes(unsigned char*, unsigned long) in prf.o
  "___gmpz_clear", referenced from:
      rsa_shredKey(_RSA_KEY*) in rsa.o
  "___gmpz_export", referenced from:
      zToFile(__sFILE*, __mpz_struct*) in rsa.o
  "___gmpz_import", referenced from:
      zFromFile(__sFILE*, __mpz_struct*) in rsa.o
  "___gmpz_init", referenced from:
      rsa_initKey(_RSA_KEY*) in rsa.o
      setSeed(unsigned char*, unsigned long) in prf.o
  "___gmpz_limbs_read", referenced from:
      randBytes(unsigned char*, unsigned long) in prf.o
  "___gmpz_limbs_write", referenced from:
      rsa_shredKey(_RSA_KEY*) in rsa.o
  "___gmpz_set_ui", referenced from:
      rsa_initKey(_RSA_KEY*) in rsa.o
      setSeed(unsigned char*, unsigned long) in prf.o
  "___gmpz_size", referenced from:
      zToFile(__sFILE*, __mpz_struct*) in rsa.o
      rsa_numBytesN(_RSA_KEY*) in rsa.o
      rsa_shredKey(_RSA_KEY*) in rsa.o
      randBytes(unsigned char*, unsigned long) in prf.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我不确定是什么导致了这个错误。链接器似乎是问题所在,因为我在 rsa-test.c 中使用了 rsa.c 和 prf.c 中的函数,这就是导致此问题的原因。

如果您想测试我的文件,请告诉我,我会发布它们。

【问题讨论】:

标签: c linker


【解决方案1】:

您需要通过在gcc -o 命令中添加链接标志来链接到您正在使用的库。

看起来您正在使用 GMP,因此该标志应该是 -lgmp

如果涉及的其他库是 OpenSSL,请尝试 -lcrypto 或查看 here(如果您是从源代码构建的)。

gcc -o test_linked.exe rsa.o prf.o rsa-test.o -lgmp -lcrypto

【讨论】:

    【解决方案2】:

    在链接时,您应该包括库或共享库以及带有 -L 选项的可选库路径,例如

    gcc -o binary *.o -L /path/to/libraries -llibrary
    

    -llibrary 看起来像这样

    liblibrary.so or liblibrary.so* 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多